{
  "markdown": "# 42min developers\n\nPublic packaging and contracts for [42min](https://42min.us), a meeting scheduling\nplatform. This repository holds what you need to build on 42min or connect an AI agent to\nit. The product itself is closed source.\n\n| | |\n|---|---|\n| **REST API** | `https://api.42min.us/v1` |\n| **MCP server** | `https://api.42min.us/mcp` |\n| **Documentation** | [42min.us/help/api](https://42min.us/help/api) |\n| **Status** | OAuth 2.1, Dynamic Client Registration, personal access tokens |\n\n## What is here\n\n### `plugins/42min`\n\nThe 42min plugin for Cursor. Connects the editor's agent to your 42min account over OAuth\nand exposes 35 scheduling tools. See its [README](plugins/42min/README.md).\n\nAny MCP client can connect without this plugin, by pointing at\n`https://api.42min.us/mcp`. The server publishes OAuth protected-resource metadata, so a\ncompliant client discovers everything else on its own.\n\n### `openapi/42min.v1.yaml`\n\nThe OpenAPI 3.1 description of the public REST API, for generating clients, importing into\nPostman or Bruno, and feeding to a coding agent.\n\nIt is hand-written, and checked against the running API by a contract test suite that\nexercises every documented endpoint and validates the live response, headers and error\nbodies against these schemas. That is how the first draft's seven mistakes were found,\nincluding two that would have broken every generated client on every booking write. A\nroute-coverage check fails the build if an endpoint exists but is undocumented, or the\nreverse.\n\nThose checks run in our private repository, because they boot the API against a real\ndatabase and cannot run here. What CI in *this* repository enforces is that the file is a\nvalid OpenAPI 3.1 document, so a malformed spec never reaches you.\n\nIf you find a place where this file and the API disagree, the file is probably wrong:\nplease [open an issue](https://github.com/42min-us/42min-developers/issues/new?labels=specification).\n\n### `server.json`\n\nThe [official MCP Registry](https://modelcontextprotocol.io/registry/remote-servers) entry.\nDeclares this as a remote server on streamable HTTP at `https://api.42min.us/mcp`, so\nregistry-backed directories can list it without anyone hand-filling a form.\n\n### `mcp/tools.json`\n\nThe MCP contract, as a machine-readable snapshot: every tool with its JSON Schema for\narguments, the scopes it needs, whether it writes, and the annotations a client uses to\ndecide when to ask you before calling. Generated from the running tool registry, not\nhand-maintained, and gated by a test that fails when the two disagree.\n\nRead it if you are building a client, or feed it to a coding agent. The table in the\n[plugin README](plugins/42min/README.md) is the human summary of the same thing.\n\n### `examples/webhook-receiver`\n\nA working receiver in about 120 lines with no dependencies, and ten tests for\n`verify.js` alone. Signature verification is where integrations break: the usual cause is\nverifying a re-serialized body rather than the raw bytes, which no amount of reading the\ndocs makes obvious. Copy `verify.js` and move on.\n\n## Built on this API\n\n- **[n8n community node](https://github.com/42min-us/n8n-nodes-42min)** (`n8n-nodes-42min`).\n  Bookings, event types, slots and the current user, plus a trigger for every webhook\n  event with signature verification built in. Runs inside your own n8n, so booking data\n  goes from 42min to your server and nowhere else.\n\n## Authentication in one paragraph\n\nTwo mechanisms. **OAuth 2.1** with PKCE for applications acting on behalf of a user,\nincluding Dynamic Client Registration, so a client can register itself without a support\nticket. **Personal access tokens** for scripts acting as one person. Both carry scopes;\nthe API refuses anything a token's scopes do not cover. Discovery documents live at\n`/.well-known/oauth-authorization-server` and `/.well-known/oauth-protected-resource`.\n\nFull detail: [Authentication](https://42min.us/help/api/authentication).\n\n## Things worth knowing before you build\n\n- **Mutating booking calls accept `Idempotency-Key`.** Retry with the same key. A new key\n  creates a second booking.\n- **`PATCH /v1/bookings/{uid}` uses ETags.** Read the ETag, send it back as `If-Match`, and\n  a concurrent edit fails loudly instead of silently overwriting.\n- **There is no test environment yet.** Write operations act on production: they send\n  real email and create real calendar events. Test on event types you own, and clean up\n  after yourself. (Our help pages use \"sandbox\" for something else, the per-credential\n  isolation of webhook subscriptions.)\n- **Ignore unknown response fields.** We add fields without notice; see\n  [CHANGELOG.md](CHANGELOG.md) for the full versioning policy and the six-month\n  deprecation guarantee.\n\n## Support\n\nOpen an [issue](https://github.com/42min-us/42min-developers/issues) for API bugs,\nspecification errors, or plugin problems. Security reports go to plus@42min.us, not to the\nissue tracker: see [SECURITY.md](SECURITY.md).\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n",
  "bytes": 5045,
  "sha": "81f2a1e72b8fd8ab0ba93dd1b7b0e0040d358397ad04c2ccba92e8a4b40821c2",
  "repo_slug": "42min-us/42min-developers",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_us_42min_meetings_2b8919ba/readme"
}