Saltar al contenido
mcpizer 0.1.0 · bf25803
MCP gateway with authorization

Callingis not acting

It decides, for each caller, which tools they see, which account executes and under which limits.

Today, from the repo · 40 seconds
$ git clone https://github.com/rflvz/mcpizer
$ cd mcpizer && pnpm i && pnpm build
$ pnpm mcpizer validate examples/policy.yaml --catalog examples/catalog.yaml

Once published — today it is a 404
$ npx mcpizer validate my-policy.yaml

It deploys nothing. It exits with allowed or denied per capability, with a reason and file:line:column.

7
ports
19
implementations
8
reasons, no ninth
0
users yet

I

What itreturns

A denial does not merely say no: it says why, and the exact place to touch.

Three calls
principal   corp:ana  [team=ventas role=analyst]

PERMITIDO
  motivo    granted — una concesión lo cubre
  sobre     crm.contact.read
  sitio     examples/policy.yaml:95:5  /grants/0
  cuenta    crm-solo-lectura
  techo     500 llamadas por 1h
  ve        crm-principal/get_contact, crm-principal/search_contacts
Where it stopped
  1. declared
  2. realized
  3. granted
  4. account
  5. ceiling
Reason · closed vocabulary granted una concesión lo cubre examples/policy.yaml:95:5 /grants/0
principal   corp:ana  [team=ventas role=analyst]

DENEGADO
  motivo    no_grant_matches — ninguna concesión cubre esta capacidad para este principal
  sobre     crm.contact.write
  sitio     examples/policy.yaml:95:3  /grants
Where it stopped
  1. declared
  2. realized
  3. granted stopped here
  4. account
  5. ceiling
Reason · closed vocabulary no_grant_matches ninguna concesión cubre esta capacidad para este principal examples/policy.yaml:95:3 /grants
principal   corp:ana  [team=ventas role=analyst]

DENEGADO
  motivo    usage_unknown — el uso acumulado es desconocido, y eso se trata como techo agotado
  sobre     crm-solo-lectura
  sitio     examples/policy.yaml:95:5  /grants/0
Where it stopped
  1. declared
  2. realized
  3. granted
  4. account
  5. ceiling stopped here
Reason · closed vocabulary usage_unknown el uso acumulado es desconocido, y eso se trata como techo agotado examples/policy.yaml:95:5 /grants/0

All three calls are the same person. What changes is the capability and the state of the counter — and the reason says which of the two it was.


II

The placeyou touch

Line 95 above is this one. Four fields: to whom, what, under which account and under which ceiling.

 95  - to:  # A to whom 96      issuer: corp 97      attributes: { team: ventas } 98    capabilities: [crm.contact.read]  # B which capabilities 99    using: crm-solo-lectura  # C which account100    limits:  # D which ceiling101      calls: 500102      per: 1h
A to whom
An issuer and the attributes that select it. Only declared ones.
B which capabilities
Domain capabilities, not tool names. Which tool realises them is the catalogue’s business.
C which account
The execution identity. Only its reference lives here; the credential is not in the artefact.
D which ceiling
The limit. If consumption cannot be known, it is treated as exhausted.

III

Two handlesthat donot fit

The C above is a reference, not a credential. There is no type common to the two, deliberately.

Principal
id
identifier
attributes
key-value pairs for selection

Never carries credential material.

AccountRef
id
opaque handle

Not a credential, not a credential wrapper, and not something a credential can be derived from.

  1. 01

    Denied by default.

  2. 02

    The core never sees credentials.

  3. 03

    Every decision carries a reason — permissions included.

  4. 04

    The credential resolves after authorization, never before.

  5. 05

    Unknown usage is an exhausted ceiling.

Five invariants · they do not depend on configuration


IV

What is hereand whatis not

Everything on this page is generated by the CLI. Including the numbers that do not flatter.

7
ports
19
implementations
22
checks
4
with no breaking case
Every port, more than one implementation · none forced a contract change
Port Implementations
¿quién invoca? clave estática OIDC/JWT por JWKS mTLS por nombre distinguido
¿de dónde sale la política? fichero git a una referencia fija HTTPS
¿qué tools hay? catálogo declarado descubrimiento MCP (tools/list)
¿cuánto se ha usado? memoria del proceso Redis
¿de dónde sale la credencial? variable de entorno Vault gestor de secretos cloud OAuth con refresco
¿cómo se invoca? MCP por stdio MCP por HTTP streamable
¿dónde va la auditoría? JSON a stderr OpenTelemetry por OTLP fichero con rotación

A check without a case that makes it fail checks nothing. These 4 do not have one yet, and they are named here:

  • Missing el import profundo no resuelve declared-surface.test.ts:34
  • Missing lo que se publica se instala installable.test.ts:74
  • Missing y el descuido que ningún manifiesto delata installable.test.ts:210
  • Missing el manifiesto publicado dice lo que hay que decir installable.test.ts:250

The packages are not published yet.

blocked on the licence

A licence still has to be chosen.

decision 0042, open

No adapter has a user yet.

7 ports · 19 adapters · 0 users


V

Fourcommands

No network, no credentials, and no deployment anywhere.

$ git clone https://github.com/rflvz/mcpizer
$ cd mcpizer && pnpm i && pnpm build
$ pnpm mcpizer validate examples/policy.yaml --catalog examples/catalog.yaml