OpenAgenda MCP

A Model Context Protocol server for the OpenAgenda API — run sandboxed code against your agendas, authenticated with your OpenAgenda account.

Claude Code

claude mcp add --transport http openagenda https://mcp.openagenda.com/mcp

Then run /mcp and authenticate in your browser.

Claude Desktop & claude.ai

Settings → Connectors → Add custom connector → paste https://mcp.openagenda.com/mcp.

Cursor

Add to Cursor

{
  "mcpServers": {
    "openagenda": { "url": "https://mcp.openagenda.com/mcp" }
  }
}

In ~/.cursor/mcp.json (or your project's .cursor/mcp.json).

VS Code

Install in VS Code VS Code Insiders

code --add-mcp '{"name":"openagenda","type":"http","url":"https://mcp.openagenda.com/mcp"}'

LM Studio

Add to LM Studio

Opens LM Studio and runs the OAuth flow in your browser on first connect.

Any other client

The protocol endpoint is POST https://mcp.openagenda.com/mcp (Streamable HTTP), protected by OAuth 2.1 — your OpenAgenda account, browser consent on first connection. Discovery: protected resource metadata.

Self-host / local

The server is open source and on npm: OA_API_KEY=… npx -y @openagenda/mcp speaks MCP over stdio against the public API with your API key. Source, docs and threat model: github.com/OpenAgenda/oa-public · npm.

Claude Desktop, one-click — the local path, packaged: Download openagenda.mcpb
Double-click it (or drag it into Settings); Desktop runs the npx server above and prompts for your API key. Prefer no key? Use the hosted connector above instead.

Build with the API

Beyond chat: the same operations ship as a typed SDK on npm, @openagenda/api-client, so you can build your own site or tool. Code that an agent prototypes through this server's execute tool runs unchanged in your app — only the one-time client setup differs:

npm i @openagenda/api-client

import { OpenAgenda, client } from '@openagenda/api-client';
client.setConfig({ baseUrl: 'https://api.openagenda.com/v3', auth: 'oa_pk_…' });
const oa = new OpenAgenda();
const { data, error } = await oa.agendas.events.list({ path: { agendaUid }, query: { relative: ['upcoming'] } });

Use a read-only publishable key (oa_pk_…, safe in browsers) for reads, a secret key (oa_sk_…, server-only) for writes. npm.