About openglass-mcp
OpenGlass provides a neutral record and verification layer for interactions between AI agents. It is intended for teams that need agents to register, attest actions, and conduct sealed sessions, with a vendor-neutral risk policy and framework integrations.
Key features
- 01Agent registration and claims
- 02Action attestations and witnessed sessions
- 03Independent record verification
- 04Versioned vendor-neutral risk policy
- 05OpenTelemetry and LangChain integrations
Use cases
- 01Record an agent-to-agent negotiation
- 02Verify a session record independently
- 03Classify actions before attestation
- 04Attest risky OpenTelemetry or LangChain calls
MCP support
OpenGlass runs an MCP endpoint at `/mcp`. Its MCP tools let clients access OpenGlass capabilities for agent registration, action attestations, and witnessed sessions.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://mcp.openglass.glass/mcpclaude mcp add --transport http federico2001-openglass https://mcp.openglass.glass/mcp{"mcpServers":{"federico2001-openglass":{"type":"http","url":"https://mcp.openglass.glass/mcp"}}}Open in Cursor{"servers":{"federico2001-openglass":{"type":"http","url":"https://mcp.openglass.glass/mcp"}}}Open in VS Code{"mcpServers":{"federico2001-openglass":{"type":"http","url":"https://mcp.openglass.glass/mcp"}}}{"mcpServers":{"federico2001-openglass":{"serverUrl":"https://mcp.openglass.glass/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
14| Parameter | Type | Required | Description |
|---|---|---|---|
| auth | object | Yes | |
| auth.kid | string | Yes | Your signing key id (key_...) — or the literal "new" for register_agent. |
| auth.sig | string | Yes | base64url Ed25519 signature per OpenGlass SPEC §4.1, computed locally over sha256(JCS({method, path, timestamp, nonce, bodySha256})). This server cannot compute this for you — it never holds or generates private keys. |
| auth.nonce | string | Yes | Fresh random value (base64url recommended), unique per request. |
| auth.agentId | string | No | Your own agent id (agt_...). Omit only for register_agent's self-signed call. |
| auth.timestamp | string | Yes | RFC3339 UTC timestamp at signing time, e.g. new Date().toISOString(). |
| meta | object | No | |
| meta.homepage | string | No | |
| meta.software | string | No | |
| name | string | Yes | A human-readable name for this agent. |
| publicKey | string | Yes | Your Ed25519 public key, base64url-encoded (43 chars, no padding). |
| description | string | Yes | What this agent does, for its public profile. |
Details
From the project READMEOpenGlass
A neutral witness for agent-to-agent interactions. See docs/SPEC.md and CLAUDE.md.
Run locally
docker compose up --build -d --wait
curl -k https://localhost/health # {"status":"ok","checks":{"mongo":"ok","s3":"ok"}}
Caddy serves https://localhost with a certificate from its internal CA. -k skips verification. To trust the CA instead:
docker compose cp caddy:/data/caddy/pki/authorities/local/root.crt ./caddy-root.crt
curl --cacert caddy-root.crt https://localhost/health
| Service | URL | Notes |
|---|---|---|
| web | https://localhost/ | Next.js |
| api | https://localhost/health, /v1/* | Fastify. Runs migrate on every start. |
| mcp | https://localhost/mcp | |
| mongo | mongodb://localhost:27017/openglass?directConnection=true | mongo:7, single-node replica set rs0 |
| minio | http://localhost:9001 (console) | bucket openglass-records, Object Lock on. User openglass / openglass-dev-secret. |
| mailpit | http://localhost:8025 | Catches all outgoing email |
MinIO no longer publishes official images, so compose uses the maintained community build pgsty/minio, pinned to a release.
See it in action
examples/witnessed-negotiation is a runnable, end-to-end demo: two agents register, get claimed, negotiate a purchase order over a witnessed session, close it, and independently verify the resulting record — against the real API, not a mock. See examples/README.md.
Risk policy
/spec/openglass-policy is a small, versioned, vendor-neutral YAML format for classifying an agent's action as low/medium/high risk — deciding when an action is worth a witnessed record, separate from the attestation mechanism itself (docs/SPEC.md §12). Reference evaluators: core-js (@openglass/core) and core-py (openglass-core), kept in sync by a shared set of test vectors. See docs/POLICY.md for the guide.
Integrations
otel-js/otel-py (openglass-otel) plug into an already-OpenTelemetry-instrumented agent: a SpanProcessor reads GenAI spans, classifies each against an openglass-policy, and opens an attestation for the risky ones — no OpenGlass-specific code in the agent itself. See examples/otel-integration for a runnable demo. langchain-py (openglass-langchain) does the same for LangChain tool calls via a BaseCallbackHandler — see examples/langchain-integration. /integrations/_template is the starting point for a new framework-specific integration, including the conformance tests every integration must pass.
The public /integrations page is the request board: a card per framework (from a static catalog, apps/api/data/integrations.yaml), voting and a request form (gated on the existing owner login, not GitHub OAuth — see the PR that added this for why), and an admin view at /integrations/admin to update status. Admin access needs the ADMIN_EMAILS env var set (comma-separated owner emails) — nobody is an admin until it is.
scripts/adoption-review.ts is a runnable report over that board's live data (vote leaderboard, the 3 frameworks to prioritize next, new requests) — run it yourself or from your own cron, whenever you want it, rather than it running unattended:
node --experimental-strip-types scripts/adoption-review.ts
# optionally: OG_ADMIN_SESSION_COOKIE="og_session=..." to include the request queue (admin-only)
Develop and test
corepack enable
pnpm install
pnpm -r build
pnpm -r typecheck
pnpm -r test # starts a throwaway mongo:7 container (needs Docker)
Same tests, different MongoDB
The database is configured by MONGODB_URI and nothing else. With MONGODB_URI unset, the tests start a throwaway mongo:7 container. With it set, they run against that server instead. Each test file uses its own og_test_<random> database and drops its collections afterwards.
# the local compose Mongo
MONGODB_URI='mongodb://localhost:27017/openglass?directConnection=true' pnpm -r test
# an Atlas free-tier cluster: only the URI changes
MONGODB_URI='mongodb+srv://<user>:<password>@<cluster>.mongodb.net/openglass?retryWrites=true&w=majority' pnpm -r test
For the Atlas run:
- The database user needs
readWriteAnyDatabaseanddbAdminAnyDatabase. Tests create per-file databases, andmigraterunscollModto set validators. - Your IP must be on the cluster's access list.
The production app user only needs readWrite and dbAdmin on the openglass database.
Schema changes
- Collections are defined in
packages/db/src/models. Each has a Zod model, a$jsonSchemavalidator generated from that model, and named indexes.migrateapplies all of them idempotently on api start, under a lock. - Data changes go in versioned scripts:
pnpm --filter @openglass/db migration:create <name>, which writes topackages/db/migrations.
Deploy
main is built, pushed to ECR and deployed to a single EC2 instance by .github/workflows/deploy.yml. The AWS resources and first-time setup are in infra/README.md.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.