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/mcp

From 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).

bash
curl "https://operome.dev/api/evaluate?section=211&KillsPerson=true"
bash - list all sections
curl "https://operome.dev/api/sections"
bash - fail-closed machine evaluation
curl "https://operome.dev/api/evaluate?mode=machine&section=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 carry op, value and satisfying_children; fact leaves carry a state of supplied_true, supplied_false, unknown_needed or unknown_moot.
  • facts — the leaves grouped by relevance: supplied, unknown_needed (only when the result is unknown) and unknown_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 (equals facts.unknown_needed), not every unsupplied variable.
  • escalations — each {note, element?}, with element naming the variable it attaches to when it derives from one.

Claude Code

claude config (~/.claude/mcp.json)
{
  "mcpServers": {
    "stgb-operome": {
      "transport": {
        "type": "http",
        "url": "https://operome.dev/mcp"
      }
    }
  }
}

Codex (OpenAI)

codex config
{
  "mcp": {
    "servers": {
      "stgb-operome": {
        "url": "https://operome.dev/mcp",
        "headers": { "Accept": "application/json, text/event-stream" }
      }
    }
  }
}

curl — list tools

bash
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

bash
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.

ToolParametersReturns

stgb_list_sections

List sections, optionally filtered by chapter.

chapter? : stringArray<{id, ref, title_en, chapter}>

stgb_get_section

Full record for a section by id.

id : stringFull section record (variables, computables, rules, markup, flags)

stgb_get_schema

Synthesised XSD-style schema for the section.

id : stringXSD 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.

factsSame shape as stgb_evaluate

stgb_search

Tokenised English/German search across titles, statutory text, variables, computables, markup and rules.

query : stringArray<{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.