[{"data":1,"prerenderedAt":1200},["ShallowReactive",2],{"navigation_docs":3,"-docs-mcp-operator-gateway":356,"-docs-mcp-operator-gateway-surround":1195},[4,8,34,64,90,139,157,171,193,227,241,266,312,334],{"title":5,"path":6,"stem":7},"Documentation","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started\u002Findex",[13,14,18,22,26,30],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F01.getting-started\u002F01.introduction",{"title":19,"path":20,"stem":21},"Concepts","\u002Fdocs\u002Fgetting-started\u002Fconcepts","docs\u002F01.getting-started\u002F02.concepts",{"title":23,"path":24,"stem":25},"Quickstart (5 minutes)","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F01.getting-started\u002F03.quickstart",{"title":27,"path":28,"stem":29},"Local development","\u002Fdocs\u002Fgetting-started\u002Flocal-development","docs\u002F01.getting-started\u002F04.local-development",{"title":31,"path":32,"stem":33},"FAQ","\u002Fdocs\u002Fgetting-started\u002Ffaq","docs\u002F01.getting-started\u002F05.faq",{"title":35,"path":36,"stem":37,"children":38},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F02.architecture\u002Findex",[39,40,44,48,52,56,60],{"title":35,"path":36,"stem":37},{"title":41,"path":42,"stem":43},"Architecture overview","\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F02.architecture\u002F01.overview",{"title":45,"path":46,"stem":47},"Services","\u002Fdocs\u002Farchitecture\u002Fservices","docs\u002F02.architecture\u002F02.services",{"title":49,"path":50,"stem":51},"Request lifecycle","\u002Fdocs\u002Farchitecture\u002Frequest-lifecycle","docs\u002F02.architecture\u002F03.request-lifecycle",{"title":53,"path":54,"stem":55},"Data model","\u002Fdocs\u002Farchitecture\u002Fdata-model","docs\u002F02.architecture\u002F04.data-model",{"title":57,"path":58,"stem":59},"Status and evidence","\u002Fdocs\u002Farchitecture\u002Fstatus-and-evidence","docs\u002F02.architecture\u002F05.status-and-evidence",{"title":61,"path":62,"stem":63},"Target architecture and authority","\u002Fdocs\u002Farchitecture\u002Ftarget-architecture","docs\u002F02.architecture\u002F06.target-architecture",{"title":65,"path":66,"stem":67,"children":68},"Auth","\u002Fdocs\u002Fauth","docs\u002F03.auth\u002Findex",[69,70,74,78,82,86],{"title":65,"path":66,"stem":67},{"title":71,"path":72,"stem":73},"Overview","\u002Fdocs\u002Fauth\u002Foverview","docs\u002F03.auth\u002F01.overview",{"title":75,"path":76,"stem":77},"Organization and agent model","\u002Fdocs\u002Fauth\u002Forg-project-model","docs\u002F03.auth\u002F02.org-project-model",{"title":79,"path":80,"stem":81},"Issuing API keys","\u002Fdocs\u002Fauth\u002Fissuing-api-keys","docs\u002F03.auth\u002F03.issuing-api-keys",{"title":83,"path":84,"stem":85},"Multi-tenant RLS","\u002Fdocs\u002Fauth\u002Fmulti-tenant-rls","docs\u002F03.auth\u002F04.multi-tenant-rls",{"title":87,"path":88,"stem":89},"Operator sessions and step-up","\u002Fdocs\u002Fauth\u002Foperator-sessions","docs\u002F03.auth\u002F05.operator-sessions",{"title":91,"path":92,"stem":93,"children":94},"Proxy","\u002Fdocs\u002Fproxy","docs\u002F04.proxy\u002Findex",[95,96,99,103,107,111,115,119,123,127,131,135],{"title":91,"path":92,"stem":93},{"title":71,"path":97,"stem":98},"\u002Fdocs\u002Fproxy\u002Foverview","docs\u002F04.proxy\u002F01.overview",{"title":100,"path":101,"stem":102},"Authentication","\u002Fdocs\u002Fproxy\u002Fauthentication","docs\u002F04.proxy\u002F02.authentication",{"title":104,"path":105,"stem":106},"Request routing","\u002Fdocs\u002Fproxy\u002Frequest-routing","docs\u002F04.proxy\u002F03.request-routing",{"title":108,"path":109,"stem":110},"Sessions","\u002Fdocs\u002Fproxy\u002Fsessions","docs\u002F04.proxy\u002F04.sessions",{"title":112,"path":113,"stem":114},"Directives","\u002Fdocs\u002Fproxy\u002Fdirectives","docs\u002F04.proxy\u002F05.directives",{"title":116,"path":117,"stem":118},"Idempotency and budgets","\u002Fdocs\u002Fproxy\u002Fidempotency-and-budgets","docs\u002F04.proxy\u002F06.idempotency-and-budgets",{"title":120,"path":121,"stem":122},"Rate limiting","\u002Fdocs\u002Fproxy\u002Frate-limiting","docs\u002F04.proxy\u002F07.rate-limiting",{"title":124,"path":125,"stem":126},"Provider adapters","\u002Fdocs\u002Fproxy\u002Fprovider-adapters","docs\u002F04.proxy\u002F08.provider-adapters",{"title":128,"path":129,"stem":130},"Auth caching","\u002Fdocs\u002Fproxy\u002Fauth-caching","docs\u002F04.proxy\u002F09.auth-caching",{"title":132,"path":133,"stem":134},"Configuration","\u002Fdocs\u002Fproxy\u002Fconfiguration","docs\u002F04.proxy\u002F10.configuration",{"title":136,"path":137,"stem":138},"Provider routing and resilience","\u002Fdocs\u002Fproxy\u002Fprovider-routing-and-resilience","docs\u002F04.proxy\u002F11.provider-routing-and-resilience",{"title":140,"path":141,"stem":142,"children":143},"Memory","\u002Fdocs\u002Fmemory","docs\u002F05.memory\u002Findex",[144,145,149,153],{"title":140,"path":141,"stem":142},{"title":146,"path":147,"stem":148},"Memory overview","\u002Fdocs\u002Fmemory\u002Foverview","docs\u002F05.memory\u002F01.overview",{"title":150,"path":151,"stem":152},"Write path","\u002Fdocs\u002Fmemory\u002Fwrite-path","docs\u002F05.memory\u002F02.write-path",{"title":154,"path":155,"stem":156},"Search and lifecycle","\u002Fdocs\u002Fmemory\u002Fsearch-and-lifecycle","docs\u002F05.memory\u002F03.search-and-lifecycle",{"title":158,"path":159,"stem":160,"children":161},"Context","\u002Fdocs\u002Fcontext","docs\u002F06.context\u002Findex",[162,163,167],{"title":158,"path":159,"stem":160},{"title":164,"path":165,"stem":166},"Assembly pipeline","\u002Fdocs\u002Fcontext\u002Foverview","docs\u002F06.context\u002F01.overview",{"title":168,"path":169,"stem":170},"Ranking and packing","\u002Fdocs\u002Fcontext\u002Franking-and-packing","docs\u002F06.context\u002F02.ranking-and-packing",{"title":172,"path":173,"stem":174,"children":175},"Intelligence","\u002Fdocs\u002Fintelligence","docs\u002F07.intelligence\u002Findex",[176,177,181,185,189],{"title":172,"path":173,"stem":174},{"title":178,"path":179,"stem":180},"Workers","\u002Fdocs\u002Fintelligence\u002Fworkers","docs\u002F07.intelligence\u002F01.workers",{"title":182,"path":183,"stem":184},"Extraction","\u002Fdocs\u002Fintelligence\u002Fextraction","docs\u002F07.intelligence\u002F02.extraction",{"title":186,"path":187,"stem":188},"Embedder","\u002Fdocs\u002Fintelligence\u002Fembedder","docs\u002F07.intelligence\u002F03.embedder",{"title":190,"path":191,"stem":192},"Extraction evaluation","\u002Fdocs\u002Fintelligence\u002Fevaluation","docs\u002F07.intelligence\u002F04.evaluation",{"title":194,"path":195,"stem":196,"children":197},"API reference","\u002Fdocs\u002Fapi-reference","docs\u002F08.api-reference\u002Findex",[198,199,203,207,211,215,219,223],{"title":194,"path":195,"stem":196},{"title":200,"path":201,"stem":202},"Chat completions","\u002Fdocs\u002Fapi-reference\u002Fchat-completions","docs\u002F08.api-reference\u002F01.chat-completions",{"title":204,"path":205,"stem":206},"Responses","\u002Fdocs\u002Fapi-reference\u002Fresponses","docs\u002F08.api-reference\u002F02.responses",{"title":208,"path":209,"stem":210},"Errors","\u002Fdocs\u002Fapi-reference\u002Ferrors","docs\u002F08.api-reference\u002F03.errors",{"title":212,"path":213,"stem":214},"Health and metrics","\u002Fdocs\u002Fapi-reference\u002Fproxy-health","docs\u002F08.api-reference\u002F04.proxy-health",{"title":216,"path":217,"stem":218},"HTTP route inventory","\u002Fdocs\u002Fapi-reference\u002Fhttp-routes","docs\u002F08.api-reference\u002F05.http-routes",{"title":220,"path":221,"stem":222},"Management API","\u002Fdocs\u002Fapi-reference\u002Fmanagement-api","docs\u002F08.api-reference\u002F06.management-api",{"title":224,"path":225,"stem":226},"Auth gRPC (ValidateToken, ValidateAgent)","\u002Fdocs\u002Fapi-reference\u002Fauth-grpc","docs\u002F08.api-reference\u002F07.auth-grpc",{"title":228,"path":229,"stem":230,"children":231},"MCP","\u002Fdocs\u002Fmcp","docs\u002F09.mcp\u002Findex",[232,233,237],{"title":228,"path":229,"stem":230},{"title":234,"path":235,"stem":236},"Memory server","\u002Fdocs\u002Fmcp\u002Fmemory-server","docs\u002F09.mcp\u002F01.memory-server",{"title":238,"path":239,"stem":240},"Operator gateway","\u002Fdocs\u002Fmcp\u002Foperator-gateway","docs\u002F09.mcp\u002F02.operator-gateway",{"title":242,"path":243,"stem":244,"children":245},"Security","\u002Fdocs\u002Fsecurity","docs\u002F10.security\u002Findex",[246,247,251,254,258,262],{"title":242,"path":243,"stem":244},{"title":248,"path":249,"stem":250},"Security overview","\u002Fdocs\u002Fsecurity\u002Foverview","docs\u002F10.security\u002F01.overview",{"title":100,"path":252,"stem":253},"\u002Fdocs\u002Fsecurity\u002Fauthentication","docs\u002F10.security\u002F02.authentication",{"title":255,"path":256,"stem":257},"Tenant isolation","\u002Fdocs\u002Fsecurity\u002Ftenant-isolation","docs\u002F10.security\u002F03.tenant-isolation",{"title":259,"path":260,"stem":261},"Secrets and keys","\u002Fdocs\u002Fsecurity\u002Fsecrets-and-keys","docs\u002F10.security\u002F04.secrets-and-keys",{"title":263,"path":264,"stem":265},"Prompt injection","\u002Fdocs\u002Fsecurity\u002Fprompt-injection","docs\u002F10.security\u002F05.prompt-injection",{"title":267,"path":268,"stem":269,"children":270},"Operations","\u002Fdocs\u002Foperations","docs\u002F11.operations\u002Findex",[271,272,276,280,284,288,292,296,300,304,308],{"title":267,"path":268,"stem":269},{"title":273,"path":274,"stem":275},"Observability","\u002Fdocs\u002Foperations\u002Fobservability","docs\u002F11.operations\u002F01.observability",{"title":277,"path":278,"stem":279},"Traces and ClickHouse","\u002Fdocs\u002Foperations\u002Ftraces-and-clickhouse","docs\u002F11.operations\u002F02.traces-and-clickhouse",{"title":281,"path":282,"stem":283},"Health checks","\u002Fdocs\u002Foperations\u002Fhealth-checks","docs\u002F11.operations\u002F03.health-checks",{"title":285,"path":286,"stem":287},"Incident response","\u002Fdocs\u002Foperations\u002Fincident-response","docs\u002F11.operations\u002F04.incident-response",{"title":289,"path":290,"stem":291},"Troubleshooting","\u002Fdocs\u002Foperations\u002Ftroubleshooting","docs\u002F11.operations\u002F05.troubleshooting",{"title":293,"path":294,"stem":295},"Billing and budgets","\u002Fdocs\u002Foperations\u002Fbilling-and-budgets","docs\u002F11.operations\u002F06.billing-and-budgets",{"title":297,"path":298,"stem":299},"Evidence and relay","\u002Fdocs\u002Foperations\u002Fevidence-and-relay","docs\u002F11.operations\u002F07.evidence-and-relay",{"title":301,"path":302,"stem":303},"Console","\u002Fdocs\u002Foperations\u002Fconsole","docs\u002F11.operations\u002F08.console",{"title":305,"path":306,"stem":307},"Failure modes and recovery","\u002Fdocs\u002Foperations\u002Ffailure-and-recovery","docs\u002F11.operations\u002F09.failure-and-recovery",{"title":309,"path":310,"stem":311},"Data lifecycle and deletion","\u002Fdocs\u002Foperations\u002Fdata-lifecycle-and-deletion","docs\u002F11.operations\u002F10.data-lifecycle-and-deletion",{"title":313,"path":314,"stem":315,"children":316},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F12.deployment\u002Findex",[317,318,322,326,330],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321},"Docker Compose (dev)","\u002Fdocs\u002Fdeployment\u002Fdocker-compose","docs\u002F12.deployment\u002F01.docker-compose",{"title":323,"path":324,"stem":325},"Environment variables","\u002Fdocs\u002Fdeployment\u002Fenvironment-variables","docs\u002F12.deployment\u002F02.environment-variables",{"title":327,"path":328,"stem":329},"Kubernetes","\u002Fdocs\u002Fdeployment\u002Fkubernetes","docs\u002F12.deployment\u002F03.kubernetes",{"title":331,"path":332,"stem":333},"Production readiness","\u002Fdocs\u002Fdeployment\u002Fproduction-readiness","docs\u002F12.deployment\u002F04.production-readiness",{"title":335,"path":336,"stem":337,"children":338},"Reference","\u002Fdocs\u002Freference","docs\u002F13.reference\u002Findex",[339,340,344,348,352],{"title":335,"path":336,"stem":337},{"title":341,"path":342,"stem":343},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","docs\u002F13.reference\u002F01.glossary",{"title":345,"path":346,"stem":347},"Roadmap and gates","\u002Fdocs\u002Freference\u002Froadmap","docs\u002F13.reference\u002F02.roadmap",{"title":349,"path":350,"stem":351},"Architecture decisions","\u002Fdocs\u002Freference\u002Fadr","docs\u002F13.reference\u002F03.adr",{"title":353,"path":354,"stem":355},"Compatibility and versioning","\u002Fdocs\u002Freference\u002Fcompatibility","docs\u002F13.reference\u002F04.compatibility",{"id":357,"title":238,"audience":358,"author":359,"authorUrl":359,"body":360,"coverIndex":359,"coverLabel":359,"coverTone":359,"date":359,"decisionStatus":359,"description":1186,"excerpt":359,"extension":1187,"featured":1188,"historical":1188,"meta":1189,"navigation":1190,"path":239,"readingTime":359,"scope":1191,"seo":1192,"sourceOfTruth":1193,"status":374,"stem":240,"tags":359,"verifiedDate":375,"__hash__":1194},"docs\u002Fdocs\u002F09.mcp\u002F02.operator-gateway.md","operator",null,{"type":361,"value":362,"toc":1172},"minimark",[363,371,376,381,404,408,564,583,587,594,604,607,611,617,624,627,631,715,727,731,734,788,791,795,798,850,853,857,871,874,991,994,998,1094,1098,1132,1147,1151,1168],[364,365,366,370],"p",{},[367,368,369],"code",{},"services\u002Fmcp-operator"," is a read-only MCP resource server for operators. It exposes four metadata-only tools and cannot register a mutating tool.",[372,373],"page-status",{"status":374,"verified":375},"IMPLEMENTED","2026-10-21",[377,378,380],"h2",{"id":379},"default-off-behavior","Default-off behavior",[364,382,383,384,387,388,391,392,395,396,399,400,403],{},"Until ",[367,385,386],{},"IBEX_MCP_OPERATOR_ENABLED=true",", the process serves only ",[367,389,390],{},"\u002Fhealth",", ",[367,393,394],{},"\u002Fready",", and ",[367,397,398],{},"\u002Fmetrics",". Transport is Streamable HTTP only; stdio is not implemented. While disabled, no database, Redis, or public-URL configuration is required. Enabling it requires ",[367,401,402],{},"IBEX_MCP_OPERATOR_DATABASE_URL","; protected profiles also require Redis, and production requires public HTTPS resource\u002Fauth-server URLs.",[377,405,407],{"id":406},"tools","Tools",[409,410,411,433],"table",{},[412,413,414],"thead",{},[415,416,417,421,424,427,430],"tr",{},[418,419,420],"th",{},"Tool",[418,422,423],{},"Arguments",[418,425,426],{},"Scope",[418,428,429],{},"Permission bit",[418,431,432],{},"Returns",[434,435,436,462,487,535],"tbody",{},[415,437,438,444,449,454,459],{},[439,440,441],"td",{},[367,442,443],{},"session.get",[439,445,446],{},[367,447,448],{},"session_id",[439,450,451],{},[367,452,453],{},"operator.read",[439,455,456],{},[367,457,458],{},"OperatorMetadataRead",[439,460,461],{},"Redacted session metadata",[415,463,464,469,474,479,484],{},[439,465,466],{},[367,467,468],{},"run.get",[439,470,471],{},[367,472,473],{},"run_id",[439,475,476],{},[367,477,478],{},"runs.read",[439,480,481],{},[367,482,483],{},"TraceRead",[439,485,486],{},"Redacted evidence-run metadata",[415,488,489,494,515,520,525],{},[439,490,491],{},[367,492,493],{},"evidence.query",[439,495,496,497,391,500,391,502,391,505,391,508,391,511,514],{},"optional ",[367,498,499],{},"trace_id",[367,501,448],{},[367,503,504],{},"request_id",[367,506,507],{},"error_code",[367,509,510],{},"status",[367,512,513],{},"limit"," 1–100 (default 25)",[439,516,517],{},[367,518,519],{},"evidence.read",[439,521,522],{},[367,523,524],{},"OperatorRedactedRead",[439,526,527,528,531,532],{},"Redacted evidence-run list with ",[367,529,530],{},"count"," and ",[367,533,534],{},"truncated",[415,536,537,542,551,556,561],{},[439,538,539],{},[367,540,541],{},"budget.get",[439,543,544,547,548,550],{},[367,545,546],{},"active_only"," (default true), ",[367,549,513],{}," 1–50 (default 20)",[439,552,553],{},[367,554,555],{},"budget.read",[439,557,558],{},[367,559,560],{},"BillingRead",[439,562,563],{},"Budget periods in cached cents",[364,565,566,567,570,571,574,575,578,579,582],{},"All tools are marked ",[367,568,569],{},"read_only","; the registry rejects a mutating tool. No tool accepts an ",[367,572,573],{},"org_id"," or ",[367,576,577],{},"agent_id"," argument; identity comes only from the validated token. Argument schemas are strict (",[367,580,581],{},"additionalProperties: false",").",[377,584,586],{"id":585},"descriptor-identity","Descriptor identity",[364,588,589,590,593],{},"Each tool has a versioned ",[367,591,592],{},"ToolSpec"," containing its scope, input\u002Foutput JSON Schema, per-call timeout, and row limit. The canonical descriptor is hashed:",[595,596,602],"pre",{"className":597,"code":599,"language":600,"meta":601},[598],"language-text","sha256:\u003Chex over sorted, compact JSON of name, version, scope, role,\n        description, input_schema, output_schema, timeout_ms, row_limit>\n","text","",[367,603,599],{"__ignoreMap":601},[364,605,606],{},"The digest is intended to bind the published surface to the server identity. Changing a schema, timeout, or limit changes the digest; treat that as a compatibility event rather than an incidental edit.",[377,608,610],{"id":609},"enforcement-order","Enforcement order",[595,612,615],{"className":613,"code":614,"language":600,"meta":601},[598],"org rate limit → resolve tool → authorize bitmap → validate args → timed read → redact → audit\n",[367,616,614],{"__ignoreMap":601},[364,618,619,620,623],{},"Rate limiting runs before tool lookup and authorization. That prevents an unauthorized or malformed call from bypassing the org budget, at the cost of unknown calls consuming budget. Rate-limit audit events retain the requested tool name. The budget is org-wide, defaults to ",[367,621,622],{},"120"," requests per minute, and supports per-org overrides; there is no per-tool or per-agent tier. Redis configured but unavailable fails closed in protected profiles.",[364,625,626],{},"Reads run under a 2-second per-tool timeout. The database session is opened only after authorization, so a denied call never reaches PostgreSQL.",[377,628,630],{"id":629},"error-semantics","Error semantics",[409,632,633,643],{},[412,634,635],{},[415,636,637,640],{},[418,638,639],{},"Code",[418,641,642],{},"Meaning",[434,644,645,655,665,675,685,695,705],{},[415,646,647,652],{},[439,648,649],{},[367,650,651],{},"rate_limited",[439,653,654],{},"Org budget exhausted",[415,656,657,662],{},[439,658,659],{},[367,660,661],{},"rate_limit_unavailable",[439,663,664],{},"Rate limiter unavailable; fail closed",[415,666,667,672],{},[439,668,669],{},[367,670,671],{},"tool_not_found",[439,673,674],{},"Unknown tool or resource hidden from this tenant",[415,676,677,682],{},[439,678,679],{},[367,680,681],{},"permission_denied",[439,683,684],{},"Authenticated but missing the required bit",[415,686,687,692],{},[439,688,689],{},[367,690,691],{},"policy_unavailable",[439,693,694],{},"Policy decision could not be made",[415,696,697,702],{},[439,698,699],{},[367,700,701],{},"invalid_params",[439,703,704],{},"Argument validation failed",[415,706,707,712],{},[439,708,709],{},[367,710,711],{},"backend_unavailable",[439,713,714],{},"Read dependency failed",[364,716,717,718,574,720,723,724,726],{},"Unknown or cross-tenant resources return ",[367,719,671],{},[367,721,722],{},"not_found",", never ",[367,725,681],{},", to avoid existence leaks.",[377,728,730],{"id":729},"redaction","Redaction",[364,732,733],{},"Output is sanitized against the tool's declared output schema:",[735,736,737,741,778,781],"ul",{},[738,739,740],"li",{},"Only schema-declared keys survive; everything else is dropped.",[738,742,743,744,391,747,391,750,391,753,391,756,391,759,391,762,391,765,391,768,391,771,391,774,777],{},"A deny-list removes sensitive names even if a schema accidentally declares them: ",[367,745,746],{},"content",[367,748,749],{},"prompt",[367,751,752],{},"token",[367,754,755],{},"secret",[367,757,758],{},"password",[367,760,761],{},"api_key",[367,763,764],{},"authorization",[367,766,767],{},"raw",[367,769,770],{},"payload",[367,772,773],{},"arguments",[367,775,776],{},"messages",", and similar.",[738,779,780],{},"Scalar types must match the schema.",[738,782,783,784,787],{},"Missing required fields fail closed with ",[367,785,786],{},"redaction_failed",".",[364,789,790],{},"The result is metadata only: no memory content, prompts, raw evidence payloads, or tool arguments.",[377,792,794],{"id":793},"audit","Audit",[364,796,797],{},"Audit is metadata-only and never blocks the read:",[409,799,800,810],{},[412,801,802],{},[415,803,804,807],{},[418,805,806],{},"Field set",[418,808,809],{},"Destination",[434,811,812,842],{},[415,813,814,836],{},[439,815,816,391,818,391,820,391,822,391,825,391,828,391,831,391,833],{},[367,817,504],{},[367,819,573],{},[367,821,577],{},[367,823,824],{},"tool_name",[367,826,827],{},"latency_ms",[367,829,830],{},"success",[367,832,507],{},[367,834,835],{},"requested_at",[439,837,838,841],{},[367,839,840],{},"ibex.mcp_tool_calls"," when ClickHouse is configured",[415,843,844,847],{},[439,845,846],{},"Descriptor hash, scope, policy decision, and the same metadata",[439,848,849],{},"Structured logs",[364,851,852],{},"Without a ClickHouse URL, audit is logging-only. A full queue drops events; a sink write is not transactional evidence and does not replace the evidence relay.",[377,854,856],{"id":855},"authorization-caveat","Authorization caveat",[858,859,862,863,866,867,870],"callout",{"title":860,"type":861},"PolicySnapshot is not wired","warning","Authorization is a bitmap check on the AuthService-validated token. The PolicySnapshot resource\u002Faction evaluator of ",[367,864,865],{},"mcp-gateway-policy.v1"," is not wired to a Python verifier. The ",[367,868,869],{},"PolicyEvaluator"," seam is the only extension point today. This is tracked in GAP-009.",[377,872,132],{"id":873},"configuration",[409,875,876,886],{},[412,877,878],{},[415,879,880,883],{},[418,881,882],{},"Variable",[418,884,885],{},"Purpose",[434,887,888,902,911,921,931,941,951,961,971,981],{},[415,889,890,895],{},[439,891,892],{},[367,893,894],{},"IBEX_MCP_OPERATOR_ENABLED",[439,896,897,898,901],{},"Default ",[367,899,900],{},"false","; enables the MCP surface",[415,903,904,908],{},[439,905,906],{},[367,907,402],{},[439,909,910],{},"Tenant-scoped read database; required when enabled",[415,912,913,918],{},[439,914,915],{},[367,916,917],{},"IBEX_MCP_OPERATOR_REDIS_URL",[439,919,920],{},"Org rate limiting; required in protected profiles",[415,922,923,928],{},[439,924,925],{},[367,926,927],{},"IBEX_MCP_OPERATOR_RATE_LIMIT_RPM",[439,929,930],{},"Org-wide requests per minute; default 120",[415,932,933,938],{},[439,934,935],{},[367,936,937],{},"IBEX_MCP_OPERATOR_RATE_LIMIT_ORG_OVERRIDES",[439,939,940],{},"Per-org RPM overrides",[415,942,943,948],{},[439,944,945],{},[367,946,947],{},"IBEX_MCP_OPERATOR_CLICKHOUSE_URL",[439,949,950],{},"Optional audit sink",[415,952,953,958],{},[439,954,955],{},[367,956,957],{},"IBEX_MCP_OPERATOR_RESOURCE_URL",[439,959,960],{},"Advertised MCP resource; public HTTPS in production",[415,962,963,968],{},[439,964,965],{},[367,966,967],{},"IBEX_MCP_OPERATOR_AUTH_SERVER_URL",[439,969,970],{},"Advertised authorization server; public HTTPS in production",[415,972,973,978],{},[439,974,975],{},[367,976,977],{},"IBEX_AUTH_GRPC_ADDR",[439,979,980],{},"AuthService target",[415,982,983,988],{},[439,984,985],{},[367,986,987],{},"IBEX_OTEL_EXPORTER_OTLP_ENDPOINT",[439,989,990],{},"Optional tracing export",[364,992,993],{},"The service has no OAuth authorization-server implementation and no write path.",[377,995,997],{"id":996},"run-locally","Run locally",[595,999,1003],{"className":1000,"code":1001,"language":1002,"meta":601,"style":601},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","uv sync --all-extras\nIBEX_ENV=development \\\nIBEX_MCP_OPERATOR_ENABLED=true \\\nIBEX_MCP_OPERATOR_DATABASE_URL=postgresql+asyncpg:\u002F\u002Fibex_app:ibex_app@127.0.0.1:5432\u002Fibex \\\nIBEX_AUTH_GRPC_ADDR=127.0.0.1:9091 \\\nuv run uvicorn app.main:app --host 127.0.0.1 --port 8091\n","bash",[367,1004,1005,1022,1039,1050,1058,1066],{"__ignoreMap":601},[1006,1007,1010,1014,1018],"span",{"class":1008,"line":1009},"line",1,[1006,1011,1013],{"class":1012},"sYn-s","uv",[1006,1015,1017],{"class":1016},"sTbE_"," sync",[1006,1019,1021],{"class":1020},"sz9Cv"," --all-extras\n",[1006,1023,1025,1029,1033,1036],{"class":1008,"line":1024},2,[1006,1026,1028],{"class":1027},"sSC40","IBEX_ENV",[1006,1030,1032],{"class":1031},"soVBu","=",[1006,1034,1035],{"class":1016},"development",[1006,1037,1038],{"class":1012}," \\\n",[1006,1040,1042,1046],{"class":1008,"line":1041},3,[1006,1043,1045],{"class":1044},"sftqT","IBEX_MCP_OPERATOR_ENABLED=true ",[1006,1047,1049],{"class":1048},"se3Ec","\\\n",[1006,1051,1053,1056],{"class":1008,"line":1052},4,[1006,1054,1055],{"class":1044},"IBEX_MCP_OPERATOR_DATABASE_URL=postgresql+asyncpg:\u002F\u002Fibex_app:ibex_app@127.0.0.1:5432\u002Fibex ",[1006,1057,1049],{"class":1048},[1006,1059,1061,1064],{"class":1008,"line":1060},5,[1006,1062,1063],{"class":1044},"IBEX_AUTH_GRPC_ADDR=127.0.0.1:9091 ",[1006,1065,1049],{"class":1048},[1006,1067,1069,1072,1075,1078,1081,1084,1088,1091],{"class":1008,"line":1068},6,[1006,1070,1071],{"class":1044},"uv ",[1006,1073,1074],{"class":1016},"run",[1006,1076,1077],{"class":1016}," uvicorn",[1006,1079,1080],{"class":1016}," app.main:app",[1006,1082,1083],{"class":1020}," --host",[1006,1085,1087],{"class":1086},"s7CZa"," 127.0.0.1",[1006,1089,1090],{"class":1020}," --port",[1006,1092,1093],{"class":1086}," 8091\n",[377,1095,1097],{"id":1096},"verification","Verification",[595,1099,1101],{"className":1000,"code":1100,"language":1002,"meta":601,"style":601},"uv run pytest -q\nuv run pytest -m integration -q\n",[367,1102,1103,1116],{"__ignoreMap":601},[1006,1104,1105,1107,1110,1113],{"class":1008,"line":1009},[1006,1106,1013],{"class":1012},[1006,1108,1109],{"class":1016}," run",[1006,1111,1112],{"class":1016}," pytest",[1006,1114,1115],{"class":1020}," -q\n",[1006,1117,1118,1120,1122,1124,1127,1130],{"class":1008,"line":1024},[1006,1119,1013],{"class":1012},[1006,1121,1109],{"class":1016},[1006,1123,1112],{"class":1016},[1006,1125,1126],{"class":1020}," -m",[1006,1128,1129],{"class":1016}," integration",[1006,1131,1115],{"class":1020},[364,1133,1134,1135,1138,1139,1142,1143,1146],{},"Integration tests require ",[367,1136,1137],{},"IBEX_MCP_OPERATOR_TEST_DATABASE_URL"," (or ",[367,1140,1141],{},"IBEX_DATABASE_URL"," \u002F ",[367,1144,1145],{},"DATABASE_URL",") and include RLS and cross-tenant checks. A passing unit suite does not prove hosted authorization.",[377,1148,1150],{"id":1149},"limits","Limits",[735,1152,1153,1156,1159,1162,1165],{},[738,1154,1155],{},"PolicySnapshot evaluation is not wired; bitmap authorization is the current decision.",[738,1157,1158],{},"Audit durability and retention are unproven by default.",[738,1160,1161],{},"No stdio transport, mutation tool, or OAuth authorization-server behavior.",[738,1163,1164],{},"Streamable-HTTP multi-replica behavior and hosted latencies are not benchmarked here.",[738,1166,1167],{},"Descriptor hashes detect surface changes; they do not prove a client pinned the expected hash.",[1169,1170,1171],"style",{},"html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":601,"searchDepth":1024,"depth":1024,"links":1173},[1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185],{"id":379,"depth":1024,"text":380},{"id":406,"depth":1024,"text":407},{"id":585,"depth":1024,"text":586},{"id":609,"depth":1024,"text":610},{"id":629,"depth":1024,"text":630},{"id":729,"depth":1024,"text":730},{"id":793,"depth":1024,"text":794},{"id":855,"depth":1024,"text":856},{"id":873,"depth":1024,"text":132},{"id":996,"depth":1024,"text":997},{"id":1096,"depth":1024,"text":1097},{"id":1149,"depth":1024,"text":1150},"Default-off, read-only MCP metadata tools with fail-closed authorization.","md",false,{},true,"shipped-local",{"title":238,"description":1186},"services\u002Fmcp-operator\u002FREADME.md; packages\u002Fmcp_gateway","-UUkmf7WRzD_GGLBJQfDRPFsZRA5yYBlVyJ9I7MSEpc",[1196,1198],{"title":234,"path":235,"stem":236,"description":1197,"children":-1},"Streamable HTTP MCP server for tenant-scoped memory search, write, and feedback.",{"title":242,"path":243,"stem":244,"description":1199,"children":-1},"Trust boundaries, tenant isolation, credential handling, and prompt-injection defenses.",1792875077777]