MCP server for AI agents
A remote MCP server with one tool per dataset. Agents look values up instead of guessing and cite the source.
How the server works
#The MCP server at https://mcp.quellenkontor.dev/v1 is a remote server implementing the Model Context Protocol. It speaks Streamable HTTP: every request is a JSON-RPC call over POST, and the response comes back as JSON. It keeps no sessions; every request stands on its own.
- There is one tool per dataset, named after the pattern
hr_datensatz. - All tools are read-only. They are marked as read-only, non-destructive and idempotent, so many clients call them without asking for confirmation.
- Every result starts with a ready-made sentence for citing, followed by the data as text and as a structured object with the same fields as the REST API.
- The server gives the agent a set of rules: look up values instead of guessing, ask for missing inputs, cite the legal basis and source. The same text is available as the prompt
quellenkontor_regeln, and below for copying.
Setup
#You need a key from your account. It is sent as the header Authorization: Bearer qk_live_….
Claude Code
With one command in the terminal:
Or as a file .mcp.json in the project. Claude Code substitutes ${QK_KEY} from your environment, so the key never appears in the file:
Cursor
In ~/.cursor/mcp.json. This file lives in your home directory, not in the project. Enter your key directly, and never put this file in a repository:
VS Code
In .vscode/mcp.json. VS Code asks for the key on first launch and stores it securely:
Claude Desktop
Claude Desktop connects to remote servers with a fixed header through the mcp-remote bridge, which starts via npx (Node.js required). In Claude Desktop's configuration file:
The header has no space after the colon; mcp-remote reads the key from the AUTH_HEADER variable. This file lives on your machine; never put it in a repository.
Other clients
We have tested Claude Code, Cursor and VS Code. Any other client that can connect to remote servers over Streamable HTTP with a custom header will work with just these two pieces of information: the address https://mcp.quellenkontor.dev/v1 and an Authorization header carrying your key.
Connect Claude.ai and ChatGPT (OAuth)
#Claude in the browser, Claude Desktop, the Claude apps and ChatGPT add remote MCP servers as connectors. Instead of a key in the header, they use OAuth: you allow access once in the browser, and the application then queries with its own key for your account. You don't need a key from your account for this.
Claude
- In Claude, open the connectors and add your own connector (custom connector).
- Enter
https://mcp.quellenkontor.dev/v1as the address. Leave the client ID and client secret empty; Claude registers itself. - If the dialog asks how people sign in, choose sign-in with OAuth, not access without sign-in.
- Click Connect. quellenkontor.dev opens: sign in, check the application, redirect and account, and click Allow.
The connector then works in Claude in the browser, in Claude Desktop and in the apps. In Team and Enterprise organizations, someone with admin rights adds it, and each member then connects their own account.
ChatGPT
- In ChatGPT, turn on developer mode in the settings under Apps and create your own app with an MCP server.
- Enter
https://mcp.quellenkontor.dev/v1as the address and choose OAuth as the authentication. ChatGPT registers itself; you don't need a client ID or secret. - ChatGPT then opens quellenkontor.dev. Sign in and click Allow.
What happens when you sign in
- The consent page shows the application's name, the address Quellenkontor sends you back to, your account and your plan. The application provides its own name, so rely on the address.
- When you click Allow, Quellenkontor creates an API key named “MCP: application name” and hands it to the application. It appears in your account next to your other keys and counts toward your plan's maximum number of keys.
- Tool calls through the connector use the same quota as any other request.
initializeandtools/listalso work without signing in; only a tool call needs the key. - The key doesn't expire. If you revoke it in your account, the server answers the next tool call with 401. Claude then asks you to sign in again; in ChatGPT, you reconnect the app.
- Every connection creates its own key. When you reconnect an application, revoke the old key in your account, otherwise you'll quickly reach the maximum.
Technical details
| Item | Detail |
|---|---|
| Protected resource metadata (RFC 9728) | https://mcp.quellenkontor.dev/.well-known/oauth-protected-resource/v1 |
| Authorization server (RFC 8414) | https://mcp.quellenkontor.dev/.well-known/oauth-authorization-server |
| Endpoints | /authorize, /token and /register on mcp.quellenkontor.dev, the consent page on quellenkontor.dev |
| Registration (RFC 7591) | dynamic, as a public client without a secret (token_endpoint_auth_method none) |
| Redirect addresses | https, or http only for localhost and 127.0.0.1, with any port |
| PKCE (RFC 7636) | required, S256 only |
| resource (RFC 8707) | the MCP server address, for example https://mcp.quellenkontor.dev/v1 |
| Code | valid for 60 seconds and redeemable once. If it comes back a second time, Quellenkontor revokes the key issued for it. |
| Token | an API key qk_live_…, token_type Bearer, no expiry and no refresh token |
| Response to the application | includes iss (RFC 9207) |
All tools
#The full input schema for each tool is in the dataset's reference page under "Schema for MCP". An agent gets it via tools/list.
Load only selected areas
#A bot built for one topic rarely needs all 24 tools. With an addition to the address, tools/list returns only part of them, which saves tokens and prevents mix-ups:
| Address | Tools |
|---|---|
https://mcp.quellenkontor.dev/v1?bereiche=fristen,kalender | just the Employment law and deadlines and Calendar areas |
https://mcp.quellenkontor.dev/v1?werkzeuge=hr_pausen,hr_arbeitstage | just these tools, plus hr_verlauf for their tables |
The areas are called lohn (Wages and thresholds), sozialversicherung (Social security and levies), steuer (Tax and travel expenses), fristen (Employment law and deadlines), kalender (Calendar).
System prompt for your bot
#Many chatbot frameworks do not pass the server's rules on to the model. In that case, copy them into your application's system prompt. The server's rules are written in German, since that is what it actually sends:
A call in detail
#This is what a tool call looks like on the wire. Normally your client handles this; for testing, curl also works:
Quota
#A tool call that returns a result counts like one REST API request. initialize, tools/list and calls with invalid arguments are free. You can find the state after every call in the result under _meta, in the key quellenkontor.dev/kontingent, with limit, usage and plan.
Errors
#| Situation | Server response |
|---|---|
| An argument is missing, has the wrong format or is unknown | Result with isError: true, a message and the affected parameter. The model can correct the call. Does not count. |
| No value for the effective date | Result with isError: true and the code kein_wert. Does not count. |
| Key missing or revoked | HTTP 401 with the WWW-Authenticate header including resource_metadata, and JSON-RPC error -32001. OAuth clients use it to start sign-in. |
| Quota used up | Result with isError: true and the code kontingent_erreicht, plus _meta with the current state |
| Unknown tool | JSON-RPC error -32602 |
| Unknown method | JSON-RPC error -32601 |
| Unsupported protocol version in the MCP-Protocol-Version header | HTTP 400 with the list of supported versions |
Protocol and limits
#- Supported protocol versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. The server responds with the version the client requests, otherwise with the latest.
- Methods:
initialize,ping,tools/list,tools/call,prompts/listandprompts/get(prompt quellenkontor_regeln).resources/listreturns an empty list. - No server-sent stream: a GET on the address gets a 405 from the server; notifications without an id get 202.
- No sessions: the Mcp-Session-Id header is not needed.
Testing with the MCP Inspector
#The MCP Inspector is the protocol's official testing tool. It shows every tool with its schema and lets you run calls by hand:
In the Inspector, choose the Streamable HTTP transport, enter the address https://mcp.quellenkontor.dev/v1, and under Authentication set the Authorization header to Bearer qk_live_….
Sample questions for an agent
#| Question | Tool |
|---|---|
| What is the minimum wage from January 1, 2027, and what does that mean for the mini-job limit? | hr_mindestlohn |
| Employment started March 1, 2017; the employer's notice of termination was received on November 10, 2026. When does the employment end? | hr_kuendigungsfrist |
| How many working days does January 2027 have in Bavaria? | hr_arbeitstage |
| Which contribution ceiling applies in 2026 for pension insurance? | hr_rechengroessen |
| How much vacation is statutorily owed for a three-day work week? | hr_urlaubsanspruch |
| What is the taxable benefit for my electric company car worth €62,000? (The agent asks for the acquisition date.) | hr_dienstwagen |
| My employee works on May 1, 2027, base pay €20. How much of the premium is tax-free? | hr_sfn_zuschlaege |
| What is the basic tax allowance (Grundfreibetrag) for 2027? (The answer is provisional until the tax law is promulgated.) | hr_einkommensteuer_eckwerte |
| When does the 1962 birth cohort reach the statutory retirement age? | hr_regelaltersgrenze |
A good agent states the legal basis and source from the result, asks about missing inputs and says when a value is still provisional. If your application gives the model its own instructions, add that HR values may only come from the tools.
Something missing or unclear? Write to us and we will extend the docs.