MCP quick start
The StGB Operome MCP server speaks JSON-RPC 2.0 over Streamable HTTP. Stateless, POST-only. Anonymous tier: 60 requests/min per client. Registered tier: 600/min with a bearer token (request one below).
Machine catalogue and restrictions
The ordinary evaluator remains available across all 105 included sections. The enforcement overlay has 40 selected machine-action candidates: 34 are enforcement-ready and 6 are quarantined because their complete corpus dependency closures do not yet validate.
MCP restricts before the call
The stgb_machine_evaluate tool schema advertises only the 34 admitted profile IDs. A conforming agent cannot select a quarantined or non-machine section from the tool contract, and the runtime rejects an unsupported ID even if a client bypasses the schema.
REST rejects unsupported profiles
REST accepts a URL before it can constrain the choice. A machine-mode request outside the admitted catalogue returns HTTP 422 with machine_profile_unavailable instead of an unreliable evaluation. Quarantined profiles include their validation issues.
Public callers cannot grant authority
An authorised value sent by MCP, REST or the Playground is an unverified claim. It cannot produce allow. Only a trusted capability broker inside an enforced deployment may verify authority for the exact operation, destination and object.
Unknown remains non-executable
Both block and escalate mean that the proposed action must not execute. Allow requires a determined negative material result plus independently verified positive authority.
These restrictions apply only to machine-action enforcement. They do not prevent anyone from browsing, inspecting or legally evaluating the complete public Operome. Try the Playground to see the separation directly.
Endpoint
https://operome.dev/mcpFrom any command line
A plain REST convenience layer sits beside the MCP endpoint. Same evaluator, same telemetry, same rate limits. No JSON-RPC, no client library - just GET requests with query parameters. Pass the section as a paragraph number (e.g. 211) or by id (e.g. Murder), and every other query parameter is treated as a variable assignment (Name=true|false|unknown or a numeric value).
curl "https://operome.dev/api/evaluate?section=211&KillsPerson=true"
curl "https://operome.dev/api/sections"
curl "https://operome.dev/api/evaluate?mode=machine§ion=202a&WithoutAuthorisation=true&DataNotIntendedForActor=true&SpeciallySecured=true&StoredNonPerceivably=true&goal.ObtainsAccessForSelf=true&goal.OvercomesAccessProtection=true&authorization=not_authorised"
Returns {section, rule, result, derivation, facts, missing, escalations} as JSON. For the section list: {sections: [{id, ref, title_en, chapter}, ...]}.
Machine mode keeps legal attribution separate, evaluates conduct without treating an AI as a natural person, accepts structured goal facts using thegoal. prefix, and returns an enforcement decision. Goal facts cannot satisfy human subjective legal elements; those are returned asnot_assessed_for_machine. Bothblock andescalate are non-executable; only a positively authorised action with a determined negative material result can be allowed. Public API authorization assertions are unverified and cannot grant an allow; an enforced deployment must verify authority in an external capability broker.
Legal-mapping boundary
Machine mode screens selected material elements. It does not establish criminal liability, attribute guilt to an AI or substitute for German legal review. Section 202c is particularly narrow: selecting an ordinary dual-use program for a harmful task does not by itself make that program an offence-purpose program. That mapping remains quarantined pending specialist review and appropriate evidence about the object covered by the provision.
Read the incident analysis or inspect the versioned evidence package.
rule— the composite's expression string (the top-level boolean rule).derivation— an annotated tree rooted at the composite. Operator nodes carryop,valueandsatisfying_children; fact leaves carry astateofsupplied_true,supplied_false,unknown_neededorunknown_moot.facts— the leaves grouped by relevance:supplied,unknown_needed(only when the result isunknown) andunknown_not_required. Relevance is computed generically by a pivotal test, so a fact never required is never reported as missing.missing— now the pivotal unknowns only (equalsfacts.unknown_needed), not every unsupplied variable.escalations— each{note, element?}, withelementnaming the variable it attaches to when it derives from one.
Claude Code
{
"mcpServers": {
"stgb-operome": {
"transport": {
"type": "http",
"url": "https://operome.dev/mcp"
}
}
}
}Codex (OpenAI)
{
"mcp": {
"servers": {
"stgb-operome": {
"url": "https://operome.dev/mcp",
"headers": { "Accept": "application/json, text/event-stream" }
}
}
}
}curl — list tools
curl -X POST 'https://operome.dev/mcp' \
-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'curl — evaluate a section
curl -X POST 'https://operome.dev/mcp' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "stgb_evaluate",
"arguments": {
"id": "AbuseOfPersonUnderCare",
"facts": {
"VictimUnderEighteen": "true",
"UnderCare": "true",
"Torments": "true"
}
}
}
}'Tools reference
stgb_search accepts English or German terms in any order. German titles and statutory discovery text are generated in the public StGB Operome repository from a checksum-pinned official XML snapshot at gesetze-im-internet.de, then bundled with this application. Search makes no request to the government site or another remote service. The versioned source, manifest and checksum are public. Results return both title_en and title_de. Search identifies candidate sections only. The section's encoded scope and evaluation output remain authoritative for what the Operome actually evaluates.
| Tool | Parameters | Returns |
|---|---|---|
stgb_list_sections List sections, optionally filtered by chapter. | chapter? : string | Array<{id, ref, title_en, chapter}> |
stgb_get_section Full record for a section by id. | id : string | Full section record (variables, computables, rules, markup, flags) |
stgb_get_schema Synthesised XSD-style schema for the section. | id : string | XSD string |
stgb_evaluate Evaluate a single section deterministically (Kleene K3). | id : string, facts : {var → "true"|"false"|"unknown"|<number>} | {composite, rule, result, derivation (tree), facts{supplied,unknown_needed,unknown_not_required}, missing[], escalations[]} |
stgb_machine_evaluate Fail-closed machine-action check; separates conduct materialisation from legal attribution. | id, facts?, goal?, goalFacts?, goalSource?, authorization? | {legal, material, goalEvidence, subjectiveElements, authorization, enforcement} |
stgb_master_rule Evaluate MasterRule (§13). ExceptionActApplies derived from §32 / §34 / §228 vs §35. | facts | Same shape as stgb_evaluate |
stgb_search Tokenised English/German search across titles, statutory text, variables, computables, markup and rules. | query : string | Array<{id, ref, title_en, title_de, chapter}> |
Request an API key
Single field, no account, no password. We email your key once. Anonymous use does not require this — it only raises your rate limit to 600 requests/min.
