OuterSpace Apizr
OfficialThe OuterSpace Apizr MCP server lets you statically analyze a Python startup project, assess its readiness for exposure, and plan how to expose its capabilities as REST or MCP tools without executing or modifying anything.
Analyze project structure and static capabilities: inspect modules, functions, imports, relationships, and diagnostics via
apizr_analyze.Assess readiness under a policy: evaluate capabilities, effects (network, filesystem, subprocess, etc.), execution mode compatibility, and diagnostics via
apizr_readiness.Plan exposure: propose a selection of capabilities and interfaces (REST/MCP) with compatible execution modes and requirements via
apizr_plan_exposure.Verify repository revision: all tools accept an optional
expected_repository_digestto ensure analysis targets a specific project state.Operate safely: all tools are read-only, idempotent, non-destructive, and do not generate, execute, modify configuration, or publish anything.
Exports verified REST bundles as Bruno collections, enabling import into the Bruno API client for testing and sharing.
Provides a GitHub Action for validating and building Apizr projects within GitHub CI workflows.
Provides a GitLab CI component source for validating and building Apizr projects within GitLab pipelines.
Exports verified REST bundles as Insomnia collections, enabling import into the Insomnia API client for testing and sharing.
Exports verified REST bundles as Postman collections, enabling import into Postman for testing and sharing.
OuterSpace Apizr
Turn existing Python functions into REST APIs or MCP tools. Inspect training scripts and notebooks, record experiments, and compare their results.
Apizr 0.4.6 supports Python 3.11–3.15 on macOS and Linux.
Install
With uv:
uv tool install outerspace-apizr==0.4.6
apizr --version
Prefer pip or Homebrew? Follow the installation guide.
Related MCP server: molmcp
Try it
Save this as pricing.py:
def total(quantity: int, unit_price: float) -> float:
return round(quantity * unit_price, 2)Inspect the function, then generate its MCP server:
apizr inspect pricing.py
apizr generate mcp pricing.py --select total --output-dir dist/mcpApizr reads the function without running it. You choose which functions to expose. The generated server runs them when a client calls them.
Follow the Quickstart to start a server and make your first REST or MCP calls. The full walkthrough explains how this works across a project.
Work with experiments
Start with a training script or notebook you want to understand:
apizr experiment inspect train.pyThe report shows the data, parameters and calculations found in the source. It does not train a model or invent scores.
You can then run trusted code, keep its history, compare results and share a selected prediction function. Start with the Data Scientist quickstart, or follow the Academy.
Go further
The core handles inspection and generation. Plugins are optional. Run generated services and experiments only with code and dependencies you trust.
Documentation · Release notes · Contributing · Report an issue
Available Tools
6 toolsapizr_analyzeAnalyze Python ProjectARead-onlyIdempotent
Discover static capability identities, source evidence and relationships when you need to find what to inspect. Does not execute project code. Choose full, summary or exact capability/module detail. Retain a capability ID and the returned repository digest for optional expected_repository_digest pinning; next inspect readiness or test an exposure plan. Evidence is assessed afresh and is not cached for later calls. This tool grants no execution or exposure authority.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | full returns the complete canonical artifact/report; summary returns bounded evidence for compact inspection; detail focuses on exactly one capability or module and can paginate ancillary records. Reduced views are not partial canonical Catalog, Graph or Readiness artifacts. | full |
| limit | No | Maximum ancillary records in a detail page, from 1 to 200; omitted/null uses 50. Focus and principal blockers are not paged away. The response byte bound still applies and may refuse even one large record. | |
| module | No | One exact logical module name, for example package.model, not a source path. Only for detail, with capability_id omitted/null. | |
| offset | No | Zero-based offset into deterministically ordered ancillary detail records after filtering; defaults to 0. Only detail accepts pagination. A nonzero offset requires expected_repository_digest. Use page.next_offset with the same filter; there is no persistent server-side pagination session. | |
| capability_id | No | Exact canonical capability ID, for example python:model:predict. Only for detail, with module omitted/null. No fuzzy matching, source-path matching or implicit capability selection. | |
| expected_repository_digest | No | Optional consistency pin: omit or use null to discover normally without asserting a previous identity, or supply a lowercase 64-character hexadecimal SHA-256 value. Copy repository_digest.value from a previous full result, or identity.repository_digest.value from a bounded view. This plain value is the repository evidence identity expected from this call's discovery of the startup source scope; it does not select another repository. A mismatch is refused with repository_changed. Digest objects, algorithm prefixes and uppercase are invalid. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description adds genuinely new behavior: no code execution, no execution or exposure authority, evidence re-assessed and not cached, and digest-mismatch refusal. That is substantial context beyond the structured fields, though one point is somewhat restated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is dense and front-loaded with the core purpose, followed by mode choice, workflow, freshness and authority limits. Minor redundancy between 'does not execute project code' and 'grants no execution or exposure authority', but every sentence carries weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description nonetheless covers safety, freshness, digest pinning and next-step tools. Remaining gap is only the lack of direct sibling naming for routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a workflow rationale for expected_repository_digest (retain the returned digest to pin a later call) and summarizes the view choices. This exceeds what the schema alone conveys about parameter intent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: discover static capability identities, source evidence and relationships. It also clarifies the non-execution scope. It does not name the sibling tools directly, only alluding to 'inspect readiness or test an exposure plan', so sibling differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear workflow context ('when you need to find what to inspect', retain the capability ID and digest, then inspect readiness or test an exposure plan) and calls out the three view modes. It stops short of an explicit when-not statement or naming the alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apizr_experiment_diffCompare Experiment RunsARead-onlyIdempotent
Compare two verified local Runs directionally from A to B using canonical experiment comparison. Returns recorded changes, unknown evidence and finite numeric deltas, never causal conclusions. Requires the configured project's history.read grant. Does not execute, retrain, expose or mutate records; inspect show for the original evidence behind differences.
| Name | Required | Description | Default |
|---|---|---|---|
| run_a | Yes | First recorded Run identity or unique lowercase prefix; comparison is directional from A to B. | |
| run_b | Yes | Second recorded Run identity or unique lowercase prefix; differences describe evidence, never causality. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial extra context: the required history.read grant, the fact it does not execute, retrain, expose or mutate records, and the shape of the output (recorded changes, unknown evidence, finite numeric deltas, no causal claims). That is exactly the added-value disclosure expected when annotations cover the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core compare action and followed by constraint/return/routing details. Every clause carries information, though the 'never causal conclusions' idea is echoed again in the run_b schema description, making it slightly repetitive rather than maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail need not be in the description, and the remaining gaps an agent needs are covered: the permission requirement, the no-side-effect guarantee, the directional semantics, and the pointer to apizr_experiment_show for underlying evidence. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so run_a and run_b are already fully documented, including the directional A-to-B semantics the description also mentions. The description adds no syntax, prefix-uniqueness rule, or format guidance beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Compare two verified local Runs') with explicit scope ('directionally from A to B using canonical experiment comparison'), and distinguishes itself from the sibling by redirecting to 'inspect show for the original evidence behind differences.' An agent can tell it apart from apizr_experiment_show/list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context (comparing two existing runs) and states the precondition ('Requires the configured project's history.read grant'), plus points to apizr_experiment_show for raw evidence. It does not explicitly frame when-not to use it beyond 'never causal conclusions,' so it falls just short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apizr_experiment_listList Experiment RunsARead-onlyIdempotent
List verified local experiment Runs, including CLI, SDK and Jupyter captures, with recorded parameters and metrics. Requires an explicit history.read operator grant for the configured project's store. Filters and limit only affect presentation: every retained record is validated. No execution, exposure or store mutation; next use show or diff with returned Run identities.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum displayed Runs, from 1 to 1000; does not reduce validation of the complete bounded history. | |
| source | No | Optional exact recorded project-relative source reference, never a filesystem target. | |
| status | No | Optional exact recorded status; all records are validated before this display filter. | |
| capability | No | Optional exact recorded capability identity; SDK sessions may have none. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real value: it discloses a required authorization grant, and that filters and limit affect only presentation while every retained record is still validated. This is behavioral context an agent cannot infer from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences that front-load the operation and scope before moving to prerequisites and follow-ups; each sentence carries distinct information. It is compact, though the terminology is jargon-heavy and some clauses pack multiple ideas together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full input schema and an output schema present, return values need not be explained, and the description correctly covers purpose, authorization prerequisite, filter semantics, and next-step routing. Nothing critical is missing for an agent to invoke it correctly, though ordering or pagination behavior of the bounded history is not addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, and the description's framing that filters/limit do not reduce validation largely restates the schema's own limit and status notes. Baseline 3 is appropriate since the description adds little parameter semantics beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List verified local experiment Runs') and enumerates the capture types it covers (CLI, SDK, Jupyter) with their recorded parameters and metrics. It is clearly separable from apizr_experiment_show and apizr_experiment_diff, which it explicitly routes the agent to for follow-up.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the prerequisite ('explicit history.read operator grant for the configured project's store') and points to the correct successors ('use show or diff with returned Run identities'), and clarifies what the tool does not do (no execution, exposure, or store mutation). It lacks an explicit when-not-to-use statement, but the routing guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apizr_experiment_showShow Experiment EvidenceARead-onlyIdempotent
Read one verified recorded Run and its intended Plan using an exact digest or unique prefix. Includes producer and capture evidence when retained; unknown provenance stays unknown. Requires the configured project's history.read grant. Does not execute project code, load the producing provider, expose capabilities or mutate the store; compare two identities with diff.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | Full recorded Run SHA-256 or unique lowercase prefix of 12 to 64 hexadecimal characters; ambiguity refuses the request. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, and the description still adds real context beyond them: the required history.read grant, that producer/capture evidence is included only when retained, that unknown provenance is surfaced as unknown, and an explicit list of non-actions (no code execution, no provider load, no capability exposure, no mutation).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core read action before evidence, auth, and negative-scope clauses. Dense but every clause is load-bearing; only the trailing diff pointer feels slightly bolted on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema, full annotation coverage, and 100% schema description coverage, the description supplies the missing pieces an agent needs: auth requirement, evidence/provenance semantics, and explicit non-effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the run_id description already documents the digest/prefix format and ambiguity refusal, so the description's 'exact digest or unique prefix' adds little new meaning. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one verified recorded Run and its intended Plan') plus the lookup key (exact digest or unique prefix). This clearly separates it from siblings like apizr_experiment_list (enumerate) and apizr_experiment_diff (compare two identities).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the sibling alternative and its trigger condition ('compare two identities with diff'), which routes the agent away from this tool for comparison work. It stops short of stating when-not-to-use for the other siblings (list, analyze, readiness).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apizr_plan_exposurePlan Capability ExposureARead-onlyIdempotent
Test an exposure proposal when you know which capabilities to expose. Evaluates explicit selection, interfaces and execution constraints against current static evidence/readiness; uses a supplied policy or the startup exposure policy. Returns proposed capability/interface/execution combinations. Does not generate a server, execute a function, change project configuration, publish anything or create operator authorization. For exposure_refused, inspect structured diagnostics/actions and revise the proposal or its evidence before trying again.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional refused-plan diagnostic page size, from 1 to 200; omitted/null uses 50 when pagination is requested. With offset and limit both omitted/null, all refusal diagnostics are returned. Successful plans remain unchanged. | |
| offset | No | Optional zero-based offset into deterministically ordered refused-plan diagnostics; defaults to 0. A nonzero offset requires expected_repository_digest. Successful canonical plans are never paginated; there is no server-side session. | |
| policy | No | Explicit proposal policy to use for this plan. Omitted/null uses the startup exposure policy if present; if neither exists, returns policy_required. ExposurePolicy is a planning constraint, not operator authority: it cannot enlarge startup permissions or authorize generation, execution or publication. | |
| expected_repository_digest | No | Optional consistency pin: omit or use null to discover normally without asserting a previous identity, or supply a lowercase 64-character hexadecimal SHA-256 value. Copy repository_digest.value from a previous full result, or identity.repository_digest.value from a bounded view. This plain value is the repository evidence identity expected from this call's discovery of the startup source scope; it does not select another repository. A mismatch is refused with repository_changed. Digest objects, algorithm prefixes and uppercase are invalid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| interfaces | Yes | Requested interfaces validated for all selected capabilities; none has been generated, deployed or run by planning. |
| capabilities | Yes | Selected capability proposals with their readiness evidence, interface compatibility and compatible execution modes; not an execution or publication grant. |
| graph_digest | Yes | Identity of the complete canonical static relationship/import Graph used for this proposal. |
| catalog_digest | Yes | Identity of the complete canonical static Catalog used for this proposal. |
| schema_version | No | Version of this successful exposure proposal contract. A plan is not generation, execution, publication or authorization. |
| external_modules | Yes | Lexically observed external module names; this does not resolve, install or authorize dependencies. |
| repository_digest | Yes | Repository evidence identity against which this proposal was assessed; value can pin a subsequent call. |
| exposure_policy_digest | Yes | Identity of the exposure selection and execution constraints used for planning, not operator authority. |
| observed_support_modules | Yes | Logical support modules observed in the selected static evidence; these are not additional exposed capabilities. |
| repository_readiness_digest | Yes | Identity of the canonical repository readiness assessment used for this proposal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent, closed-world read, but the description adds real behavioral scope: it enumerates what the call does NOT do (no generation, execution, config change, publication, or operator authorization) and describes the exposure_refused outcome plus the revise-and-retry path. Return shape ('proposed capability/interface/execution combinations') is also stated. It stops short of explaining the refusal diagnostic structure in more detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the purpose, then scope of evaluation, negative scope, and error guidance. Dense but each sentence carries information; the negative-scope list is slightly long but earns its place given how easily this tool could be mistaken for a generator.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema coverage, the description need not explain return values, and it still summarizes the outcome and refusal handling. Combined with the annotations, an agent has enough to call it correctly; only the absence of sibling-level routing keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the inline parameter descriptions are unusually rich (digest semantics, pagination rules, policy fallback), so the schema already carries the parameter burden. The description only echoes the policy fallback ('uses a supplied policy or the startup exposure policy') and adds no syntax or format detail beyond what the schema provides — the baseline 3 for full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (test/evaluate) and resource (an exposure proposal / explicit capability selection) and enumerates what it evaluates: selection, interfaces, execution constraints against static evidence/readiness. It is clear, but it never names or contrasts the sibling tools (apizr_analyze, apizr_readiness), so an agent cannot tell from this text alone how it differs from readiness analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear triggering condition — 'when you know which capabilities to expose' — and explains the policy resolution path (supplied policy, else startup exposure policy, else policy_required). It stops short of naming alternatives or stating when-not to use it, so it does not reach the explicit routing of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apizr_readinessAssess Repository ReadinessARead-onlyIdempotent
Assess whether and under what conditions capabilities satisfy the startup readiness policy. Choose this for limitations, uncertainty and execution/control compatibility, rather than discovering identities or testing an exposure proposal. Use full, summary or exact capability/module detail, optionally pinned to a repository digest. Analysis can help find exact IDs but is not required. exit_code: 1 with isError: false is valid business evidence. Does not execute project code and does not authorize exposure. Next, use sufficient evidence to choose an explicit capability/policy for an exposure plan.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | full returns the complete canonical artifact/report; summary returns bounded evidence for compact inspection; detail focuses on exactly one capability or module and can paginate ancillary records. Reduced views are not partial canonical Catalog, Graph or Readiness artifacts. | full |
| limit | No | Maximum ancillary records in a detail page, from 1 to 200; omitted/null uses 50. Focus and principal blockers are not paged away. The response byte bound still applies and may refuse even one large record. | |
| module | No | One exact logical module name, for example package.model, not a source path. Only for detail, with capability_id omitted/null. | |
| offset | No | Zero-based offset into deterministically ordered ancillary detail records after filtering; defaults to 0. Only detail accepts pagination. A nonzero offset requires expected_repository_digest. Use page.next_offset with the same filter; there is no persistent server-side pagination session. | |
| capability_id | No | Exact canonical capability ID, for example python:model:predict. Only for detail, with module omitted/null. No fuzzy matching, source-path matching or implicit capability selection. | |
| expected_repository_digest | No | Optional consistency pin: omit or use null to discover normally without asserting a previous identity, or supply a lowercase 64-character hexadecimal SHA-256 value. Copy repository_digest.value from a previous full result, or identity.repository_digest.value from a bounded view. This plain value is the repository evidence identity expected from this call's discovery of the startup source scope; it does not select another repository. A mismatch is refused with repository_changed. Digest objects, algorithm prefixes and uppercase are invalid. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, but the description adds important non-annotation facts: it does not execute project code, does not authorize exposure, and exit_code 1 with isError false can be valid business evidence. It also notes digest pinning and that analysis can help find IDs but is not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every sentence carries substantive guidance. The description is dense across several sentences, but it avoids repetition and stays focused on selection, behavior, and next steps.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter read-only assessment tool with a full output schema and rich annotations, the description covers purpose, sibling routing, behavioral quirks, and downstream usage. An agent has enough context to call it correctly without needing return-format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter in detail. The description still adds useful integration by summarizing view choices (full, summary, exact capability/module detail) and optional repository digest pinning, though it does not elaborate on limit or offset beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: assess whether capabilities satisfy startup readiness policy conditions. It explicitly distinguishes itself from discovering identities or testing exposure proposals, so an agent can separate it from siblings like apizr_plan_exposure without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: for limitations, uncertainty, and execution/control compatibility, rather than discovering identities or testing exposure. It also names the next step, choosing a capability/policy for an exposure plan, which routes the agent downstream.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Changed
apizr_analyze42 fields changed- added
Input schema / examplesAdded value: +[ + {}, + { + "view": "summary" + }, + { + "expected_repository_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "capability_id": "python:model:predict", + "limit": 50, + "view": "detail" + } +] - added
Input schema / properties / capability_idAdded value: +{ + "anyOf": [ + { + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Exact canonical capability ID, for example python:model:predict. Only for detail, with module omitted/null. No fuzzy matching, source-path matching or implicit capability selection.", + "title": "Capability Id" +} - added
Input schema / properties / expected_repository_digest / descriptionAdded value: +"Optional consistency pin: omit or use null to discover normally without asserting a previous identity, or supply a lowercase 64-character hexadecimal SHA-256 value. Copy repository_digest.value from a previous full result, or identity.repository_digest.value from a bounded view. This plain value is the repository evidence identity expected from this call's discovery of the startup source scope; it does not select another repository. A mismatch is refused with repository_changed. Digest objects, algorithm prefixes and uppercase are invalid." - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum ancillary records in a detail page, from 1 to 200; omitted/null uses 50. Focus and principal blockers are not paged away. The response byte bound still applies and may refuse even one large record.", + "title": "Limit" +} - added
Input schema / properties / moduleAdded value: +{ + "anyOf": [ + { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "One exact logical module name, for example package.model, not a source path. Only for detail, with capability_id omitted/null.", + "title": "Module" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Zero-based offset into deterministically ordered ancillary detail records after filtering; defaults to 0. Only detail accepts pagination. A nonzero offset requires expected_repository_digest. Use page.next_offset with the same filter; there is no persistent server-side pagination session.", + "title": "Offset" +} - added
Input schema / properties / viewAdded value: +{ + "default": "full", + "description": "full returns the complete canonical artifact/report; summary returns bounded evidence for compact inspection; detail focuses on exactly one capability or module and can paginate ancillary records. Reduced views are not partial canonical Catalog, Graph or Readiness artifacts.", + "enum": [ + "full", + "summary", + "detail" + ], + "title": "View", + "type": "string" +} - changed
Input schema / titlePrevious value: -"Arguments"New value: +"ViewArguments" - added
Output schema / $defs / AnalysisCountsAdded value: +{ + "additionalProperties": false, + "properties": { + "capabilities": { + "title": "Capabilities", + "type": "integer" + }, + "catalog_diagnostics": { + "title": "Catalog Diagnostics", + "type": "integer" + }, + "graph_complete": { + "title": "Graph Complete", + "type": "boolean" + }, + "graph_diagnostics": { + "title": "Graph Diagnostics", + "type": "integer" + }, + "imports": { + "title": "Imports", + "type": "integer" + }, + "inspected_sources": { + "title": "Inspected Sources", + "type": "integer" + }, + "modules": { + "title": "Modules", + "type": "integer" + }, + "relationships": { + "title": "Relationships", + "type": "integer" + }, + "sources": { + "title": "Sources", + "type": "integer" + } + }, + "required": [ + "sources", + "inspected_sources", + "capabilities", + "modules", + "relationships", + "imports", + "graph_complete", + "catalog_diagnostics", + "graph_diagnostics" + ], + "title": "AnalysisCounts", + "type": "object" +} - added
Output schema / $defs / AnalysisDetailAdded value: +{ + "additionalProperties": false, + "properties": { + "focus": { + "description": "The exactly selected capability or logical module with its static evidence and readiness states; never paged away.", + "discriminator": { + "mapping": { + "capability": "#/$defs/CapabilityFocus", + "module": "#/$defs/ModuleFocus" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/CapabilityFocus" + }, + { + "$ref": "#/$defs/ModuleFocus" + } + ], + "title": "Focus" + }, + "identity": { + "$ref": "#/$defs/AnalysisIdentity", + "description": "Identities of the complete static artifacts; filtering and paging do not change them." + }, + "page": { + "$ref": "#/$defs/Page", + "description": "Pagination metadata for ancillary records after deterministic filtering and ordering." + }, + "principal_blockers": { + "$ref": "#/$defs/Blockers", + "description": "Bounded principal diagnostic sample for this focus with complete count and has_more." + }, + "records": { + "description": "Current page of ancillary static source, dependency, relationship, import or diagnostic evidence; dependencies are not implicitly exposed.", + "items": { + "discriminator": { + "mapping": { + "capability": "#/$defs/CapabilityRecord", + "dependency": "#/$defs/DependencyRecord", + "diagnostic": "#/$defs/DiagnosticRecord", + "import": "#/$defs/ImportRecord", + "relationship": "#/$defs/RelationshipRecord", + "source": "#/$defs/SourceRecord" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/DependencyRecord" + }, + { + "$ref": "#/$defs/CapabilityRecord" + }, + { + "$ref": "#/$defs/SourceRecord" + }, + { + "$ref": "#/$defs/RelationshipRecord" + }, + { + "$ref": "#/$defs/ImportRecord" + }, + { + "$ref": "#/$defs/DiagnosticRecord" + } + ] + }, + "title": "Records", + "type": "array" + }, + "view": { + "const": "detail", + "default": "detail", + "description": "Focused static evidence view, not a partial canonical Catalog or Graph.", + "title": "View", + "type": "string" + } + }, + "required": [ + "identity", + "focus", + "principal_blockers", + "page", + "records" + ], + "title": "AnalysisDetail", + "type": "object" +} - added
Output schema / $defs / AnalysisIdentityAdded value: +{ + "additionalProperties": false, + "properties": { + "catalog_digest": { + "$ref": "#/$defs/Digest", + "description": "Digest of the complete canonical static Catalog, unchanged by filtering or pagination." + }, + "graph_digest": { + "$ref": "#/$defs/Digest", + "description": "Digest of the complete canonical static Graph, unchanged by filtering or pagination." + }, + "repository_digest": { + "$ref": "#/$defs/Digest", + "description": "Complete repository evidence identity; copy value to expected_repository_digest for consistency pinning." + } + }, + "required": [ + "repository_digest", + "catalog_digest", + "graph_digest" + ], + "title": "AnalysisIdentity", + "type": "object" +} - added
Output schema / $defs / AnalysisResultAdded value: +{ + "additionalProperties": false, + "properties": { + "catalog": { + "$ref": "#/$defs/Catalog", + "description": "Complete canonical static capability and source evidence; does not imply successful project execution." + }, + "graph": { + "$ref": "#/$defs/Graph", + "description": "Complete canonical static relationship and import graph evidence, including uncertainty; does not imply successful project execution." + }, + "repository_digest": { + "$ref": "#/$defs/Digest", + "description": "Repository evidence identity observed by this call; copy value to expected_repository_digest to pin a subsequent call." + } + }, + "required": [ + "repository_digest", + "catalog", + "graph" + ], + "title": "AnalysisResult", + "type": "object" +} - added
Output schema / $defs / AnalysisSummaryAdded value: +{ + "additionalProperties": false, + "properties": { + "identity": { + "$ref": "#/$defs/AnalysisIdentity", + "description": "Identities of the complete static artifacts underlying this bounded view." + }, + "principal_blockers": { + "$ref": "#/$defs/Blockers", + "description": "Bounded sample of at most ten principal diagnostics with total and has_more; not all evidence." + }, + "summary": { + "$ref": "#/$defs/AnalysisCounts", + "description": "Static source, capability, relationship and diagnostic counts; no project execution is implied." + }, + "view": { + "const": "summary", + "default": "summary", + "description": "Bounded summary variant, not a partial canonical Catalog or Graph.", + "title": "View", + "type": "string" + } + }, + "required": [ + "identity", + "summary", + "principal_blockers" + ], + "title": "AnalysisSummary", + "type": "object" +} - added
Output schema / $defs / BlockersAdded value: +{ + "additionalProperties": false, + "properties": { + "has_more": { + "title": "Has More", + "type": "boolean" + }, + "shown": { + "items": { + "$ref": "#/$defs/EvidenceDiagnostic" + }, + "maxItems": 10, + "title": "Shown", + "type": "array" + }, + "total": { + "minimum": 0, + "title": "Total", + "type": "integer" + } + }, + "required": [ + "total", + "shown", + "has_more" + ], + "title": "Blockers", + "type": "object" +} - added
Output schema / $defs / CapabilityFocusAdded value: +{ + "additionalProperties": false, + "properties": { + "capability": { + "anyOf": [ + { + "$ref": "#/$defs/CapabilityEntry" + }, + { + "type": "null" + } + ] + }, + "capability_id": { + "title": "Capability Id", + "type": "string" + }, + "global_evidence_complete": { + "title": "Global Evidence Complete", + "type": "boolean" + }, + "interface_eligible": { + "title": "Interface Eligible", + "type": "boolean" + }, + "kind": { + "const": "capability", + "default": "capability", + "title": "Kind", + "type": "string" + }, + "local_readiness": { + "$ref": "#/$defs/Assessment" + }, + "module": { + "title": "Module", + "type": "string" + }, + "reasons": { + "items": { + "$ref": "#/$defs/apizr__repository_readiness__model__Reason" + }, + "title": "Reasons", + "type": "array" + }, + "repository_state": { + "$ref": "#/$defs/State" + }, + "selected_state": { + "$ref": "#/$defs/State" + }, + "source_path": { + "title": "Source Path", + "type": "string" + } + }, + "required": [ + "capability_id", + "module", + "source_path", + "capability", + "local_readiness", + "repository_state", + "selected_state", + "interface_eligible", + "global_evidence_complete", + "reasons" + ], + "title": "CapabilityFocus", + "type": "object" +} - added
Output schema / $defs / CapabilityRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "capability": { + "anyOf": [ + { + "$ref": "#/$defs/CapabilityEntry" + }, + { + "type": "null" + } + ] + }, + "capability_id": { + "title": "Capability Id", + "type": "string" + }, + "kind": { + "const": "capability", + "default": "capability", + "title": "Kind", + "type": "string" + }, + "local_state": { + "$ref": "#/$defs/State" + }, + "source_path": { + "title": "Source Path", + "type": "string" + }, + "state": { + "$ref": "#/$defs/State" + } + }, + "required": [ + "capability_id", + "source_path", + "capability", + "local_state", + "state" + ], + "title": "CapabilityRecord", + "type": "object" +} - added
Output schema / $defs / DependencyRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "exposed": { + "const": false, + "default": false, + "title": "Exposed", + "type": "boolean" + }, + "id": { + "title": "Id", + "type": "string" + }, + "kind": { + "const": "dependency", + "default": "dependency", + "title": "Kind", + "type": "string" + }, + "node": { + "anyOf": [ + { + "discriminator": { + "mapping": { + "capability": "#/$defs/CapabilityNode", + "external_module": "#/$defs/ExternalNode", + "module": "#/$defs/ModuleNode" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ModuleNode" + }, + { + "$ref": "#/$defs/CapabilityNode" + }, + { + "$ref": "#/$defs/ExternalNode" + } + ] + }, + { + "type": "null" + } + ], + "title": "Node" + } + }, + "required": [ + "id", + "node" + ], + "title": "DependencyRecord", + "type": "object" +} - added
Output schema / $defs / DiagnosticRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "diagnostic": { + "$ref": "#/$defs/EvidenceDiagnostic" + }, + "kind": { + "const": "diagnostic", + "default": "diagnostic", + "title": "Kind", + "type": "string" + } + }, + "required": [ + "diagnostic" + ], + "title": "DiagnosticRecord", + "type": "object" +} - added
Output schema / $defs / Digest / properties / algorithm / descriptionAdded value: +"Digest algorithm identifier, currently fixed to SHA-256 (sha256)." - added
Output schema / $defs / Digest / properties / value / descriptionAdded value: +"The 64-character lowercase hexadecimal SHA-256 digest value, without an algorithm prefix." - changed
Output schema / $defs / Dimension / properties / reasons / items / $refPrevious value: -"#/$defs/Reason"New value: +"#/$defs/apizr__readiness__model__Reason" - added
Output schema / $defs / EvidenceDiagnosticAdded value: +{ + "additionalProperties": false, + "properties": { + "action": { + "anyOf": [ + { + "enum": [ + "inspect_dependency", + "fix_import", + "fix_binding", + "fix_initialization", + "select_known_capability", + "resolve_interface_contract", + "adjust_execution_requirements" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Action" + }, + "capability_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Capability Id" + }, + "code": { + "maxLength": 128, + "minLength": 1, + "title": "Code", + "type": "string" + }, + "column": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Column" + }, + "dependency_path": { + "default": [], + "items": { + "type": "string" + }, + "title": "Dependency Path", + "type": "array" + }, + "line": { + "anyOf": [ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Line" + }, + "origin": { + "enum": [ + "catalog", + "graph", + "readiness", + "scope" + ], + "title": "Origin", + "type": "string" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Reason" + }, + "source_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Source Path" + } + }, + "required": [ + "origin", + "code" + ], + "title": "EvidenceDiagnostic", + "type": "object" +} - added
Output schema / $defs / ImportRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "declaration": { + "$ref": "#/$defs/ImportDeclaration" + }, + "kind": { + "const": "import", + "default": "import", + "title": "Kind", + "type": "string" + } + }, + "required": [ + "declaration" + ], + "title": "ImportRecord", + "type": "object" +} - added
Output schema / $defs / ModuleFocusAdded value: +{ + "additionalProperties": false, + "properties": { + "capability_count": { + "title": "Capability Count", + "type": "integer" + }, + "kind": { + "const": "module", + "default": "module", + "title": "Kind", + "type": "string" + }, + "module": { + "title": "Module", + "type": "string" + }, + "node": { + "anyOf": [ + { + "$ref": "#/$defs/ModuleNode" + }, + { + "type": "null" + } + ] + }, + "source": { + "anyOf": [ + { + "$ref": "#/$defs/SourceView" + }, + { + "type": "null" + } + ] + }, + "source_count": { + "title": "Source Count", + "type": "integer" + }, + "states": { + "additionalProperties": { + "type": "integer" + }, + "propertyNames": { + "$ref": "#/$defs/State" + }, + "title": "States", + "type": "object" + } + }, + "required": [ + "module", + "source_count", + "source", + "node", + "capability_count", + "states" + ], + "title": "ModuleFocus", + "type": "object" +} - added
Output schema / $defs / ObjectFieldAdded value: +{ + "additionalProperties": false, + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "required": { + "title": "Required", + "type": "boolean" + }, + "type": { + "$ref": "#/$defs/TypeSpec" + } + }, + "required": [ + "name", + "required", + "type" + ], + "title": "ObjectField", + "type": "object" +} - added
Output schema / $defs / PageAdded value: +{ + "additionalProperties": false, + "properties": { + "complete": { + "description": "True when no subsequent page remains; does not assert that static evidence itself is complete.", + "title": "Complete", + "type": "boolean" + }, + "limit": { + "description": "Maximum records requested for this page; not a response byte limit.", + "maximum": 200, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Offset for the next page, or null when complete; continue with the same filter and repository digest pin.", + "title": "Next Offset" + }, + "offset": { + "description": "Zero-based offset in the complete filtered and deterministically ordered record collection.", + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned": { + "description": "Number of records actually included in this page.", + "minimum": 0, + "title": "Returned", + "type": "integer" + }, + "total": { + "description": "Total records in the complete filtered collection before pagination.", + "minimum": 0, + "title": "Total", + "type": "integer" + } + }, + "required": [ + "offset", + "limit", + "total", + "returned", + "complete" + ], + "title": "Page", + "type": "object" +} - added
Output schema / $defs / ReadinessReport / properties / structured_typesAdded value: +{ + "default": [], + "items": { + "$ref": "#/$defs/StructuredDeclaration" + }, + "title": "Structured Types", + "type": "array" +} - removed
Output schema / $defs / ReasonRemoved value: -{ - "additionalProperties": false, - "properties": { - "code": { - "$ref": "#/$defs/apizr__readiness__model__Code" - }, - "evidence": { - "const": "inferred", - "default": "inferred", - "title": "Evidence", - "type": "string" - }, - "line": { - "title": "Line", - "type": "integer" - }, - "parameter": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Parameter" - } - }, - "required": [ - "code", - "line" - ], - "title": "Reason", - "type": "object" -} - added
Output schema / $defs / RelationshipRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "kind": { + "const": "relationship", + "default": "relationship", + "title": "Kind", + "type": "string" + }, + "relationship": { + "$ref": "#/$defs/Relationship" + } + }, + "required": [ + "relationship" + ], + "title": "RelationshipRecord", + "type": "object" +} - added
Output schema / $defs / SourceRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "kind": { + "const": "source", + "default": "source", + "title": "Kind", + "type": "string" + }, + "source": { + "$ref": "#/$defs/SourceView" + } + }, + "required": [ + "source" + ], + "title": "SourceRecord", + "type": "object" +} - added
Output schema / $defs / SourceViewAdded value: +{ + "additionalProperties": false, + "properties": { + "inspected": { + "title": "Inspected", + "type": "boolean" + }, + "is_package": { + "title": "Is Package", + "type": "boolean" + }, + "module": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Module" + }, + "path": { + "title": "Path", + "type": "string" + }, + "size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Size" + }, + "source_digest": { + "anyOf": [ + { + "$ref": "#/$defs/Digest" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "path", + "module", + "source_digest", + "size", + "inspected", + "is_package" + ], + "title": "SourceView", + "type": "object" +} - added
Output schema / $defs / StructuredDeclarationAdded value: +{ + "additionalProperties": false, + "description": "Source-bound, statically proven shape or an explicit bounded refusal.", + "properties": { + "name": { + "title": "Name", + "type": "string" + }, + "problem": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Problem" + }, + "source": { + "$ref": "#/$defs/SourceSpan" + }, + "type": { + "anyOf": [ + { + "$ref": "#/$defs/TypeSpec" + }, + { + "type": "null" + } + ], + "default": null + } + }, + "required": [ + "name", + "source" + ], + "title": "StructuredDeclaration", + "type": "object" +} - added
Output schema / $defs / TypeSpecAdded value: +{ + "additionalProperties": false, + "properties": { + "fields": { + "default": [], + "items": { + "$ref": "#/$defs/ObjectField" + }, + "title": "Fields", + "type": "array" + }, + "items": { + "default": [], + "items": { + "$ref": "#/$defs/TypeSpec" + }, + "title": "Items", + "type": "array" + }, + "kind": { + "enum": [ + "any", + "int", + "str", + "float", + "bool", + "null", + "list", + "dict", + "tuple", + "set", + "union", + "literal", + "object" + ], + "title": "Kind", + "type": "string" + }, + "values": { + "default": [], + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "title": "Values", + "type": "array" + }, + "variadic": { + "default": false, + "title": "Variadic", + "type": "boolean" + } + }, + "required": [ + "kind" + ], + "title": "TypeSpec", + "type": "object" +} - changed
Output schema / $defs / apizr__readiness__model__Code / enumPrevious value: -[ - "APIZR-READY-001", - "APIZR-READY-002", - "APIZR-READY-003", - "APIZR-READY-004", - "APIZR-READY-005", - "APIZR-READY-006", - "APIZR-READY-007", - "APIZR-READY-008", - "APIZR-READY-009", - "APIZR-READY-010", - "APIZR-READY-011", - "APIZR-READY-012", - "APIZR-READY-013", - "APIZR-READY-014", - "APIZR-READY-015", - "APIZR-READY-016", - "APIZR-READY-017", - "APIZR-READY-018" -]New value: +[ + "APIZR-READY-001", + "APIZR-READY-002", + "APIZR-READY-003", + "APIZR-READY-004", + "APIZR-READY-005", + "APIZR-READY-006", + "APIZR-READY-007", + "APIZR-READY-008", + "APIZR-READY-009", + "APIZR-READY-010", + "APIZR-READY-011", + "APIZR-READY-012", + "APIZR-READY-013", + "APIZR-READY-014", + "APIZR-READY-015", + "APIZR-READY-016", + "APIZR-READY-017", + "APIZR-READY-018", + "APIZR-READY-019" +] - added
Output schema / $defs / apizr__readiness__model__ReasonAdded value: +{ + "additionalProperties": false, + "properties": { + "code": { + "$ref": "#/$defs/apizr__readiness__model__Code" + }, + "evidence": { + "const": "inferred", + "default": "inferred", + "title": "Evidence", + "type": "string" + }, + "line": { + "title": "Line", + "type": "integer" + }, + "parameter": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Parameter" + } + }, + "required": [ + "code", + "line" + ], + "title": "Reason", + "type": "object" +} - added
Output schema / $defs / apizr__repository_readiness__model__CodeAdded value: +{ + "enum": [ + "APIZR-REPOREADY-001", + "APIZR-REPOREADY-002", + "APIZR-REPOREADY-003", + "APIZR-REPOREADY-004", + "APIZR-REPOREADY-005", + "APIZR-REPOREADY-006", + "APIZR-REPOREADY-007", + "APIZR-REPOREADY-008" + ], + "title": "Code", + "type": "string" +} - added
Output schema / $defs / apizr__repository_readiness__model__ReasonAdded value: +{ + "additionalProperties": false, + "properties": { + "code": { + "$ref": "#/$defs/apizr__repository_readiness__model__Code" + }, + "effect": { + "anyOf": [ + { + "enum": [ + "filesystem_read", + "filesystem_write", + "network", + "environment", + "subprocess", + "state_mutation", + "secrets", + "external_service" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Effect" + } + }, + "required": [ + "code" + ], + "title": "Reason", + "type": "object" +} - removed
Output schema / additionalPropertiesRemoved value: -false - added
Output schema / anyOfAdded value: +[ + { + "$ref": "#/$defs/AnalysisResult" + }, + { + "$ref": "#/$defs/AnalysisSummary" + }, + { + "$ref": "#/$defs/AnalysisDetail" + } +] - removed
Output schema / propertiesRemoved value: -{ - "catalog": { - "$ref": "#/$defs/Catalog" - }, - "graph": { - "$ref": "#/$defs/Graph" - }, - "repository_digest": { - "$ref": "#/$defs/Digest" - } -} - removed
Output schema / requiredRemoved value: -[ - "repository_digest", - "catalog", - "graph" -] - changed
Output schema / titlePrevious value: -"AnalysisResult"New value: +"AnalysisOutput"
- Added
apizr_experiment_diff - Added
apizr_experiment_list - Added
apizr_experiment_show - Changed
apizr_plan_exposure38 fields changed- added
Input schema / $defs / Eligibility / properties / allow_conditional / descriptionAdded value: +"Allow selected capabilities with CONDITIONAL readiness in their required repository evidence to be proposed, subject to all other planner checks. CONDITIONAL does not become READY; ambiguous or unsupported evidence is not made eligible." - added
Input schema / $defs / Execution / properties / allowed / descriptionAdded value: +"Explicit nonempty set of acceptable execution modes. No ranking, implicit default or fallback. Compatibility must also satisfy the startup readiness policy; selecting a mode does not execute or authorize anything." - added
Input schema / $defs / Execution / properties / require / descriptionAdded value: +"Explicit execution controls that every compatible proposed mode must support. These requirements narrow compatibility; they do not grant operator permissions or attest to a live runtime." - added
Input schema / $defs / ExposurePolicy / properties / eligibility / descriptionAdded value: +"Readiness eligibility constraints for selected capabilities; cannot replace missing or uncertain evidence." - added
Input schema / $defs / ExposurePolicy / properties / execution / descriptionAdded value: +"Explicit acceptable execution modes and required controls for compatibility planning, not permission to execute." - added
Input schema / $defs / ExposurePolicy / properties / interfaces / descriptionAdded value: +"Nonempty requested generated interface set: rest and/or mcp. Planning checks compatibility for every interface; it does not generate, deploy or run them." - added
Input schema / $defs / ExposurePolicy / properties / schema_version / descriptionAdded value: +"Version identifier for this exposure planning constraint contract; not operator authorization." - added
Input schema / $defs / ExposurePolicy / properties / selection / descriptionAdded value: +"Explicit capability selection proposal; empty defaults do not select every capability." - added
Input schema / $defs / Selection / properties / exclude / descriptionAdded value: +"Exact capability IDs removed after combining include and include_all_ready. Unknown IDs in either include or exclude are refused." - added
Input schema / $defs / Selection / properties / include / descriptionAdded value: +"Exact canonical capability IDs explicitly proposed for exposure, for example python:model:predict. No fuzzy matching or implicit dependency exposure." - added
Input schema / $defs / Selection / properties / include_all_ready / descriptionAdded value: +"Add capabilities assessed READY in the repository readiness report to the requested selection before exclusions. All planner eligibility, interface and execution checks still apply; this grants no publication or operator authority." - added
Input schema / examplesAdded value: +[ + {}, + { + "expected_repository_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "policy": { + "execution": { + "allowed": [ + "direct" + ] + }, + "interfaces": [ + "mcp" + ], + "selection": { + "include": [ + "python:model:predict" + ] + } + } + } +] - added
Input schema / properties / expected_repository_digest / descriptionAdded value: +"Optional consistency pin: omit or use null to discover normally without asserting a previous identity, or supply a lowercase 64-character hexadecimal SHA-256 value. Copy repository_digest.value from a previous full result, or identity.repository_digest.value from a bounded view. This plain value is the repository evidence identity expected from this call's discovery of the startup source scope; it does not select another repository. A mismatch is refused with repository_changed. Digest objects, algorithm prefixes and uppercase are invalid." - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional refused-plan diagnostic page size, from 1 to 200; omitted/null uses 50 when pagination is requested. With offset and limit both omitted/null, all refusal diagnostics are returned. Successful plans remain unchanged.", + "title": "Limit" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional zero-based offset into deterministically ordered refused-plan diagnostics; defaults to 0. A nonzero offset requires expected_repository_digest. Successful canonical plans are never paginated; there is no server-side session.", + "title": "Offset" +} - added
Input schema / properties / policy / descriptionAdded value: +"Explicit proposal policy to use for this plan. Omitted/null uses the startup exposure policy if present; if neither exists, returns policy_required. ExposurePolicy is a planning constraint, not operator authority: it cannot enlarge startup permissions or authorize generation, execution or publication." - added
Output schema / $defs / Digest / properties / algorithm / descriptionAdded value: +"Digest algorithm identifier, currently fixed to SHA-256 (sha256)." - added
Output schema / $defs / Digest / properties / value / descriptionAdded value: +"The 64-character lowercase hexadecimal SHA-256 digest value, without an algorithm prefix." - added
Output schema / $defs / ExposureRecord / properties / capability_id / descriptionAdded value: +"Exact canonical ID of this selected capability proposal; dependencies are not implicitly selected." - added
Output schema / $defs / ExposureRecord / properties / compatible_execution_modes / descriptionAdded value: +"Modes satisfying both the proposal's allowed modes/required controls and the readiness policy. No ranking, fallback or execution authority is implied." - added
Output schema / $defs / ExposureRecord / properties / compatible_interfaces / descriptionAdded value: +"Requested interfaces that pass static compatibility checks; every requested interface must be compatible in a successful plan." - added
Output schema / $defs / ExposureRecord / properties / effects / descriptionAdded value: +"Retained static effect evidence, including unknown effects; not observations from executing the capability." - added
Output schema / $defs / ExposureRecord / properties / module / descriptionAdded value: +"Logical Python module owning the selected capability." - added
Output schema / $defs / ExposureRecord / properties / readiness_reasons / descriptionAdded value: +"Retained reasons supporting the selected-scope readiness assessment, including conditional evidence." - added
Output schema / $defs / ExposureRecord / properties / relationships / descriptionAdded value: +"Retained static relationship and import evidence used by this capability proposal." - added
Output schema / $defs / ExposureRecord / properties / repository_readiness / descriptionAdded value: +"Readiness of the selected capability's required repository evidence. CONDITIONAL requires explicit policy allowance and is not READY or proof of successful execution." - added
Output schema / $defs / ExposureRecord / properties / requested_interfaces / descriptionAdded value: +"Interfaces explicitly requested by the proposal policy for this capability." - added
Output schema / $defs / ExposureRecord / properties / source_path / descriptionAdded value: +"Repository-relative source path for this static capability evidence, not an authorized filesystem target." - added
Output schema / properties / capabilities / descriptionAdded value: +"Selected capability proposals with their readiness evidence, interface compatibility and compatible execution modes; not an execution or publication grant." - added
Output schema / properties / catalog_digest / descriptionAdded value: +"Identity of the complete canonical static Catalog used for this proposal." - added
Output schema / properties / exposure_policy_digest / descriptionAdded value: +"Identity of the exposure selection and execution constraints used for planning, not operator authority." - added
Output schema / properties / external_modules / descriptionAdded value: +"Lexically observed external module names; this does not resolve, install or authorize dependencies." - added
Output schema / properties / graph_digest / descriptionAdded value: +"Identity of the complete canonical static relationship/import Graph used for this proposal." - added
Output schema / properties / interfaces / descriptionAdded value: +"Requested interfaces validated for all selected capabilities; none has been generated, deployed or run by planning." - added
Output schema / properties / observed_support_modules / descriptionAdded value: +"Logical support modules observed in the selected static evidence; these are not additional exposed capabilities." - added
Output schema / properties / repository_digest / descriptionAdded value: +"Repository evidence identity against which this proposal was assessed; value can pin a subsequent call." - added
Output schema / properties / repository_readiness_digest / descriptionAdded value: +"Identity of the canonical repository readiness assessment used for this proposal." - added
Output schema / properties / schema_version / descriptionAdded value: +"Version of this successful exposure proposal contract. A plan is not generation, execution, publication or authorization."
- Changed
apizr_readiness39 fields changed- added
Input schema / examplesAdded value: +[ + {}, + { + "view": "summary" + }, + { + "expected_repository_digest": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "capability_id": "python:model:predict", + "limit": 50, + "view": "detail" + } +] - added
Input schema / properties / capability_idAdded value: +{ + "anyOf": [ + { + "maxLength": 1024, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Exact canonical capability ID, for example python:model:predict. Only for detail, with module omitted/null. No fuzzy matching, source-path matching or implicit capability selection.", + "title": "Capability Id" +} - added
Input schema / properties / expected_repository_digest / descriptionAdded value: +"Optional consistency pin: omit or use null to discover normally without asserting a previous identity, or supply a lowercase 64-character hexadecimal SHA-256 value. Copy repository_digest.value from a previous full result, or identity.repository_digest.value from a bounded view. This plain value is the repository evidence identity expected from this call's discovery of the startup source scope; it does not select another repository. A mismatch is refused with repository_changed. Digest objects, algorithm prefixes and uppercase are invalid." - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "maximum": 200, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum ancillary records in a detail page, from 1 to 200; omitted/null uses 50. Focus and principal blockers are not paged away. The response byte bound still applies and may refuse even one large record.", + "title": "Limit" +} - added
Input schema / properties / moduleAdded value: +{ + "anyOf": [ + { + "maxLength": 512, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "One exact logical module name, for example package.model, not a source path. Only for detail, with capability_id omitted/null.", + "title": "Module" +} - added
Input schema / properties / offsetAdded value: +{ + "anyOf": [ + { + "maximum": 2147483647, + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Zero-based offset into deterministically ordered ancillary detail records after filtering; defaults to 0. Only detail accepts pagination. A nonzero offset requires expected_repository_digest. Use page.next_offset with the same filter; there is no persistent server-side pagination session.", + "title": "Offset" +} - added
Input schema / properties / viewAdded value: +{ + "default": "full", + "description": "full returns the complete canonical artifact/report; summary returns bounded evidence for compact inspection; detail focuses on exactly one capability or module and can paginate ancillary records. Reduced views are not partial canonical Catalog, Graph or Readiness artifacts.", + "enum": [ + "full", + "summary", + "detail" + ], + "title": "View", + "type": "string" +} - changed
Input schema / titlePrevious value: -"Arguments"New value: +"ViewArguments" - added
Output schema / $defs / BlockersAdded value: +{ + "additionalProperties": false, + "properties": { + "has_more": { + "title": "Has More", + "type": "boolean" + }, + "shown": { + "items": { + "$ref": "#/$defs/EvidenceDiagnostic" + }, + "maxItems": 10, + "title": "Shown", + "type": "array" + }, + "total": { + "minimum": 0, + "title": "Total", + "type": "integer" + } + }, + "required": [ + "total", + "shown", + "has_more" + ], + "title": "Blockers", + "type": "object" +} - added
Output schema / $defs / CapabilityEntryAdded value: +{ + "additionalProperties": false, + "properties": { + "can_generate_interface": { + "title": "Can Generate Interface", + "type": "boolean" + }, + "execution": { + "$ref": "#/$defs/ExecutionForm" + }, + "id": { + "title": "Id", + "type": "string" + }, + "ir_digest": { + "$ref": "#/$defs/Digest" + }, + "module": { + "title": "Module", + "type": "string" + }, + "readiness": { + "$ref": "#/$defs/State" + }, + "readiness_digest": { + "$ref": "#/$defs/Digest" + }, + "source_digest": { + "$ref": "#/$defs/Digest" + }, + "source_path": { + "title": "Source Path", + "type": "string" + }, + "span": { + "$ref": "#/$defs/SourceSpan" + } + }, + "required": [ + "id", + "module", + "source_path", + "source_digest", + "ir_digest", + "readiness_digest", + "readiness", + "can_generate_interface", + "execution", + "span" + ], + "title": "CapabilityEntry", + "type": "object" +} - added
Output schema / $defs / CapabilityFocusAdded value: +{ + "additionalProperties": false, + "properties": { + "capability": { + "anyOf": [ + { + "$ref": "#/$defs/CapabilityEntry" + }, + { + "type": "null" + } + ] + }, + "capability_id": { + "title": "Capability Id", + "type": "string" + }, + "global_evidence_complete": { + "title": "Global Evidence Complete", + "type": "boolean" + }, + "interface_eligible": { + "title": "Interface Eligible", + "type": "boolean" + }, + "kind": { + "const": "capability", + "default": "capability", + "title": "Kind", + "type": "string" + }, + "local_readiness": { + "$ref": "#/$defs/Assessment" + }, + "module": { + "title": "Module", + "type": "string" + }, + "reasons": { + "items": { + "$ref": "#/$defs/apizr__repository_readiness__model__Reason" + }, + "title": "Reasons", + "type": "array" + }, + "repository_state": { + "$ref": "#/$defs/State" + }, + "selected_state": { + "$ref": "#/$defs/State" + }, + "source_path": { + "title": "Source Path", + "type": "string" + } + }, + "required": [ + "capability_id", + "module", + "source_path", + "capability", + "local_readiness", + "repository_state", + "selected_state", + "interface_eligible", + "global_evidence_complete", + "reasons" + ], + "title": "CapabilityFocus", + "type": "object" +} - added
Output schema / $defs / CapabilityNodeAdded value: +{ + "additionalProperties": false, + "properties": { + "can_generate_interface": { + "title": "Can Generate Interface", + "type": "boolean" + }, + "execution": { + "$ref": "#/$defs/ExecutionForm" + }, + "id": { + "title": "Id", + "type": "string" + }, + "kind": { + "const": "capability", + "default": "capability", + "title": "Kind", + "type": "string" + }, + "module": { + "title": "Module", + "type": "string" + }, + "name": { + "title": "Name", + "type": "string" + }, + "path": { + "title": "Path", + "type": "string" + }, + "readiness": { + "$ref": "#/$defs/State" + } + }, + "required": [ + "id", + "module", + "name", + "path", + "readiness", + "can_generate_interface", + "execution" + ], + "title": "CapabilityNode", + "type": "object" +} - added
Output schema / $defs / CapabilityRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "capability": { + "anyOf": [ + { + "$ref": "#/$defs/CapabilityEntry" + }, + { + "type": "null" + } + ] + }, + "capability_id": { + "title": "Capability Id", + "type": "string" + }, + "kind": { + "const": "capability", + "default": "capability", + "title": "Kind", + "type": "string" + }, + "local_state": { + "$ref": "#/$defs/State" + }, + "source_path": { + "title": "Source Path", + "type": "string" + }, + "state": { + "$ref": "#/$defs/State" + } + }, + "required": [ + "capability_id", + "source_path", + "capability", + "local_state", + "state" + ], + "title": "CapabilityRecord", + "type": "object" +} - added
Output schema / $defs / DependencyRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "exposed": { + "const": false, + "default": false, + "title": "Exposed", + "type": "boolean" + }, + "id": { + "title": "Id", + "type": "string" + }, + "kind": { + "const": "dependency", + "default": "dependency", + "title": "Kind", + "type": "string" + }, + "node": { + "anyOf": [ + { + "discriminator": { + "mapping": { + "capability": "#/$defs/CapabilityNode", + "external_module": "#/$defs/ExternalNode", + "module": "#/$defs/ModuleNode" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/ModuleNode" + }, + { + "$ref": "#/$defs/CapabilityNode" + }, + { + "$ref": "#/$defs/ExternalNode" + } + ] + }, + { + "type": "null" + } + ], + "title": "Node" + } + }, + "required": [ + "id", + "node" + ], + "title": "DependencyRecord", + "type": "object" +} - added
Output schema / $defs / DependencyWheelAdded value: +{ + "additionalProperties": false, + "description": "Retained wheel identity and statically observed importable modules.\n\nThis establishes a provider for imports, not API compatibility, safe module\ninitialization or a successful future invocation. Consumers retain that\nuncertainty and require explicit conditional exposure.", + "properties": { + "digest": { + "$ref": "#/$defs/Digest" + }, + "filename": { + "maxLength": 255, + "title": "Filename", + "type": "string" + }, + "modules": { + "items": { + "type": "string" + }, + "maxItems": 10000, + "minItems": 1, + "title": "Modules", + "type": "array" + }, + "pin": { + "title": "Pin", + "type": "string" + } + }, + "required": [ + "pin", + "filename", + "digest", + "modules" + ], + "title": "DependencyWheel", + "type": "object" +} - added
Output schema / $defs / DiagnosticRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "diagnostic": { + "$ref": "#/$defs/EvidenceDiagnostic" + }, + "kind": { + "const": "diagnostic", + "default": "diagnostic", + "title": "Kind", + "type": "string" + } + }, + "required": [ + "diagnostic" + ], + "title": "DiagnosticRecord", + "type": "object" +} - added
Output schema / $defs / Digest / properties / algorithm / descriptionAdded value: +"Digest algorithm identifier, currently fixed to SHA-256 (sha256)." - added
Output schema / $defs / Digest / properties / value / descriptionAdded value: +"The 64-character lowercase hexadecimal SHA-256 digest value, without an algorithm prefix." - added
Output schema / $defs / EvidenceDiagnosticAdded value: +{ + "additionalProperties": false, + "properties": { + "action": { + "anyOf": [ + { + "enum": [ + "inspect_dependency", + "fix_import", + "fix_binding", + "fix_initialization", + "select_known_capability", + "resolve_interface_contract", + "adjust_execution_requirements" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Action" + }, + "capability_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Capability Id" + }, + "code": { + "maxLength": 128, + "minLength": 1, + "title": "Code", + "type": "string" + }, + "column": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Column" + }, + "dependency_path": { + "default": [], + "items": { + "type": "string" + }, + "title": "Dependency Path", + "type": "array" + }, + "line": { + "anyOf": [ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Line" + }, + "origin": { + "enum": [ + "catalog", + "graph", + "readiness", + "scope" + ], + "title": "Origin", + "type": "string" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Reason" + }, + "source_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Source Path" + } + }, + "required": [ + "origin", + "code" + ], + "title": "EvidenceDiagnostic", + "type": "object" +} - added
Output schema / $defs / ExecutionFormAdded value: +{ + "enum": [ + "sync", + "async", + "generator", + "async_generator" + ], + "title": "ExecutionForm", + "type": "string" +} - added
Output schema / $defs / ExternalNodeAdded value: +{ + "additionalProperties": false, + "properties": { + "id": { + "title": "Id", + "type": "string" + }, + "kind": { + "const": "external_module", + "default": "external_module", + "title": "Kind", + "type": "string" + }, + "module": { + "title": "Module", + "type": "string" + } + }, + "required": [ + "id", + "module" + ], + "title": "ExternalNode", + "type": "object" +} - added
Output schema / $defs / ImportRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "declaration": { + "$ref": "#/$defs/ImportDeclaration" + }, + "kind": { + "const": "import", + "default": "import", + "title": "Kind", + "type": "string" + } + }, + "required": [ + "declaration" + ], + "title": "ImportRecord", + "type": "object" +} - added
Output schema / $defs / ModuleFocusAdded value: +{ + "additionalProperties": false, + "properties": { + "capability_count": { + "title": "Capability Count", + "type": "integer" + }, + "kind": { + "const": "module", + "default": "module", + "title": "Kind", + "type": "string" + }, + "module": { + "title": "Module", + "type": "string" + }, + "node": { + "anyOf": [ + { + "$ref": "#/$defs/ModuleNode" + }, + { + "type": "null" + } + ] + }, + "source": { + "anyOf": [ + { + "$ref": "#/$defs/SourceView" + }, + { + "type": "null" + } + ] + }, + "source_count": { + "title": "Source Count", + "type": "integer" + }, + "states": { + "additionalProperties": { + "type": "integer" + }, + "propertyNames": { + "$ref": "#/$defs/State" + }, + "title": "States", + "type": "object" + } + }, + "required": [ + "module", + "source_count", + "source", + "node", + "capability_count", + "states" + ], + "title": "ModuleFocus", + "type": "object" +} - added
Output schema / $defs / ModuleNodeAdded value: +{ + "additionalProperties": false, + "properties": { + "analyzed": { + "title": "Analyzed", + "type": "boolean" + }, + "id": { + "title": "Id", + "type": "string" + }, + "kind": { + "const": "module", + "default": "module", + "title": "Kind", + "type": "string" + }, + "module": { + "title": "Module", + "type": "string" + }, + "path": { + "title": "Path", + "type": "string" + } + }, + "required": [ + "id", + "module", + "path", + "analyzed" + ], + "title": "ModuleNode", + "type": "object" +} - added
Output schema / $defs / PageAdded value: +{ + "additionalProperties": false, + "properties": { + "complete": { + "description": "True when no subsequent page remains; does not assert that static evidence itself is complete.", + "title": "Complete", + "type": "boolean" + }, + "limit": { + "description": "Maximum records requested for this page; not a response byte limit.", + "maximum": 200, + "minimum": 1, + "title": "Limit", + "type": "integer" + }, + "next_offset": { + "anyOf": [ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Offset for the next page, or null when complete; continue with the same filter and repository digest pin.", + "title": "Next Offset" + }, + "offset": { + "description": "Zero-based offset in the complete filtered and deterministically ordered record collection.", + "minimum": 0, + "title": "Offset", + "type": "integer" + }, + "returned": { + "description": "Number of records actually included in this page.", + "minimum": 0, + "title": "Returned", + "type": "integer" + }, + "total": { + "description": "Total records in the complete filtered collection before pagination.", + "minimum": 0, + "title": "Total", + "type": "integer" + } + }, + "required": [ + "offset", + "limit", + "total", + "returned", + "complete" + ], + "title": "Page", + "type": "object" +} - added
Output schema / $defs / ReadinessDetailAdded value: +{ + "additionalProperties": false, + "properties": { + "exit_code": { + "description": "Business readiness outcome: 0 denotes a successful readiness result under the assessment policy; 1 can be a valid assessment with isError: false. It is not an MCP transport or runtime failure. Consult the retained states and reasons: CONDITIONAL is not READY, and unknown or ambiguous evidence is not proof of failure.", + "enum": [ + 0, + 1 + ], + "title": "Exit Code", + "type": "integer" + }, + "focus": { + "description": "Exactly selected capability or module; local, repository and selected readiness evidence remain distinct and are never paged away.", + "discriminator": { + "mapping": { + "capability": "#/$defs/CapabilityFocus", + "module": "#/$defs/ModuleFocus" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/CapabilityFocus" + }, + { + "$ref": "#/$defs/ModuleFocus" + } + ], + "title": "Focus" + }, + "identity": { + "$ref": "#/$defs/ReadinessIdentity", + "description": "Complete repository, artifact and readiness-policy identities underlying this view." + }, + "page": { + "$ref": "#/$defs/Page", + "description": "Pagination metadata for ancillary records after deterministic filtering and ordering." + }, + "principal_blockers": { + "$ref": "#/$defs/Blockers", + "description": "Bounded principal diagnostic sample for this focus with complete count and has_more." + }, + "records": { + "description": "Current page of ancillary evidence supporting readiness; unknown evidence is retained and does not imply successful project execution.", + "items": { + "discriminator": { + "mapping": { + "capability": "#/$defs/CapabilityRecord", + "dependency": "#/$defs/DependencyRecord", + "diagnostic": "#/$defs/DiagnosticRecord", + "import": "#/$defs/ImportRecord", + "relationship": "#/$defs/RelationshipRecord", + "source": "#/$defs/SourceRecord" + }, + "propertyName": "kind" + }, + "oneOf": [ + { + "$ref": "#/$defs/DependencyRecord" + }, + { + "$ref": "#/$defs/CapabilityRecord" + }, + { + "$ref": "#/$defs/SourceRecord" + }, + { + "$ref": "#/$defs/RelationshipRecord" + }, + { + "$ref": "#/$defs/ImportRecord" + }, + { + "$ref": "#/$defs/DiagnosticRecord" + } + ] + }, + "title": "Records", + "type": "array" + }, + "view": { + "const": "detail", + "default": "detail", + "description": "Focused readiness view, not a partial canonical readiness report.", + "title": "View", + "type": "string" + } + }, + "required": [ + "identity", + "exit_code", + "focus", + "principal_blockers", + "page", + "records" + ], + "title": "ReadinessDetail", + "type": "object" +} - added
Output schema / $defs / ReadinessIdentityAdded value: +{ + "additionalProperties": false, + "properties": { + "catalog_digest": { + "$ref": "#/$defs/Digest", + "description": "Digest of the complete canonical static Catalog, unchanged by filtering or pagination." + }, + "graph_digest": { + "$ref": "#/$defs/Digest", + "description": "Digest of the complete canonical static Graph, unchanged by filtering or pagination." + }, + "readiness_policy_digest": { + "$ref": "#/$defs/Digest", + "description": "Digest of the readiness assessment policy used for this evidence." + }, + "repository_digest": { + "$ref": "#/$defs/Digest", + "description": "Complete repository evidence identity; copy value to expected_repository_digest for consistency pinning." + }, + "repository_readiness_digest": { + "$ref": "#/$defs/Digest", + "description": "Digest of the complete canonical repository readiness report, not just the displayed view." + } + }, + "required": [ + "repository_digest", + "catalog_digest", + "graph_digest", + "repository_readiness_digest", + "readiness_policy_digest" + ], + "title": "ReadinessIdentity", + "type": "object" +} - added
Output schema / $defs / ReadinessResultAdded value: +{ + "additionalProperties": false, + "properties": { + "exit_code": { + "description": "Business readiness outcome: 0 denotes a successful readiness result under the assessment policy; 1 can be a valid assessment with isError: false. It is not an MCP transport or runtime failure. Consult the retained states and reasons: CONDITIONAL is not READY, and unknown or ambiguous evidence is not proof of failure.", + "enum": [ + 0, + 1 + ], + "title": "Exit Code", + "type": "integer" + }, + "report": { + "$ref": "#/$defs/RepositoryReadinessReport", + "description": "Complete canonical static readiness assessment under the startup policy. READY, CONDITIONAL, AMBIGUOUS and UNSUPPORTED remain distinct; unknown evidence is retained. This is not proof of successful execution." + }, + "repository_digest": { + "$ref": "#/$defs/Digest", + "description": "Repository evidence identity observed by this call; copy value to expected_repository_digest to pin a subsequent call." + } + }, + "required": [ + "repository_digest", + "report", + "exit_code" + ], + "title": "ReadinessResult", + "type": "object" +} - added
Output schema / $defs / ReadinessSummaryAdded value: +{ + "additionalProperties": false, + "properties": { + "execution": { + "description": "Static execution-mode compatibility under the readiness policy, not execution authority or proof of successful execution.", + "items": { + "$ref": "#/$defs/ModeCompatibility" + }, + "title": "Execution", + "type": "array" + }, + "exit_code": { + "description": "Business readiness outcome: 0 denotes a successful readiness result under the assessment policy; 1 can be a valid assessment with isError: false. It is not an MCP transport or runtime failure. Consult the retained states and reasons: CONDITIONAL is not READY, and unknown or ambiguous evidence is not proof of failure.", + "enum": [ + 0, + 1 + ], + "title": "Exit Code", + "type": "integer" + }, + "identity": { + "$ref": "#/$defs/ReadinessIdentity", + "description": "Complete repository, artifact and readiness-policy identities underlying this view." + }, + "principal_blockers": { + "$ref": "#/$defs/Blockers", + "description": "Bounded sample of at most ten principal diagnostics with total and has_more; not all evidence." + }, + "states": { + "additionalProperties": { + "type": "integer" + }, + "description": "Counts by canonical readiness state; conditional and ambiguous evidence remain distinct from ready evidence.", + "propertyNames": { + "$ref": "#/$defs/State" + }, + "title": "States", + "type": "object" + }, + "view": { + "const": "summary", + "default": "summary", + "description": "Bounded readiness summary, not a partial canonical readiness report.", + "title": "View", + "type": "string" + } + }, + "required": [ + "identity", + "exit_code", + "states", + "execution", + "principal_blockers" + ], + "title": "ReadinessSummary", + "type": "object" +} - added
Output schema / $defs / RelationshipRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "kind": { + "const": "relationship", + "default": "relationship", + "title": "Kind", + "type": "string" + }, + "relationship": { + "$ref": "#/$defs/Relationship" + } + }, + "required": [ + "relationship" + ], + "title": "RelationshipRecord", + "type": "object" +} - added
Output schema / $defs / RepositoryReadinessPolicy / properties / dependency_wheelsAdded value: +{ + "default": [], + "items": { + "$ref": "#/$defs/DependencyWheel" + }, + "maxItems": 128, + "title": "Dependency Wheels", + "type": "array" +} - added
Output schema / $defs / SourceRecordAdded value: +{ + "additionalProperties": false, + "properties": { + "kind": { + "const": "source", + "default": "source", + "title": "Kind", + "type": "string" + }, + "source": { + "$ref": "#/$defs/SourceView" + } + }, + "required": [ + "source" + ], + "title": "SourceRecord", + "type": "object" +} - added
Output schema / $defs / SourceViewAdded value: +{ + "additionalProperties": false, + "properties": { + "inspected": { + "title": "Inspected", + "type": "boolean" + }, + "is_package": { + "title": "Is Package", + "type": "boolean" + }, + "module": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Module" + }, + "path": { + "title": "Path", + "type": "string" + }, + "size": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Size" + }, + "source_digest": { + "anyOf": [ + { + "$ref": "#/$defs/Digest" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "path", + "module", + "source_digest", + "size", + "inspected", + "is_package" + ], + "title": "SourceView", + "type": "object" +} - changed
Output schema / $defs / apizr__readiness__model__Code / enumPrevious value: -[ - "APIZR-READY-001", - "APIZR-READY-002", - "APIZR-READY-003", - "APIZR-READY-004", - "APIZR-READY-005", - "APIZR-READY-006", - "APIZR-READY-007", - "APIZR-READY-008", - "APIZR-READY-009", - "APIZR-READY-010", - "APIZR-READY-011", - "APIZR-READY-012", - "APIZR-READY-013", - "APIZR-READY-014", - "APIZR-READY-015", - "APIZR-READY-016", - "APIZR-READY-017", - "APIZR-READY-018" -]New value: +[ + "APIZR-READY-001", + "APIZR-READY-002", + "APIZR-READY-003", + "APIZR-READY-004", + "APIZR-READY-005", + "APIZR-READY-006", + "APIZR-READY-007", + "APIZR-READY-008", + "APIZR-READY-009", + "APIZR-READY-010", + "APIZR-READY-011", + "APIZR-READY-012", + "APIZR-READY-013", + "APIZR-READY-014", + "APIZR-READY-015", + "APIZR-READY-016", + "APIZR-READY-017", + "APIZR-READY-018", + "APIZR-READY-019" +] - removed
Output schema / additionalPropertiesRemoved value: -false - added
Output schema / anyOfAdded value: +[ + { + "$ref": "#/$defs/ReadinessResult" + }, + { + "$ref": "#/$defs/ReadinessSummary" + }, + { + "$ref": "#/$defs/ReadinessDetail" + } +] - removed
Output schema / propertiesRemoved value: -{ - "exit_code": { - "enum": [ - 0, - 1 - ], - "title": "Exit Code", - "type": "integer" - }, - "report": { - "$ref": "#/$defs/RepositoryReadinessReport" - }, - "repository_digest": { - "$ref": "#/$defs/Digest" - } -} - removed
Output schema / requiredRemoved value: -[ - "repository_digest", - "report", - "exit_code" -] - changed
Output schema / titlePrevious value: -"ReadinessResult"New value: +"ReadinessOutput"
3 tool updates
- First observed
apizr_analyze - First observed
apizr_plan_exposure - First observed
apizr_readiness
TDQS
Scored across 6 tools
Each tool targets a distinct phase: discovery (analyze), policy assessment (readiness), proposal testing (plan_exposure), and experiment history (list/show/diff). Boundaries are explicitly spelled out in the descriptions, though analyze and readiness both inspect the same capability space, which could cause occasional selection confusion.
All names share a clean apizr_ prefix and snake_case, but the verb/no-un structure is mixed: single verbs (analyze), nouns (readiness), and noun_verb compounds (plan_exposure, experiment_list, experiment_show). Mostly consistent with minor deviation in the base convention.
Six tools is well-scoped for the server's purpose, covering discovery, readiness, exposure planning, and an experiment list/show/diff trio. Each tool clearly earns its place with no redundancy.
The static-analysis-to-exposure-planning workflow (analyze -> readiness -> plan_exposure) and experiment inspection (list/show/diff) appear well covered. Gaps are minor, since exposure execution and server generation are intentionally out of scope for this read-only/inspection surface.
Maintenance
Related MCP Connectors
Governed AI agent skills — one library, distributed to devs and exposed to remote agents over MCP.
Discover, plan and run tools across your connected business systems through one OAuth MCP endpoint
Host any HTTP API as a standard MCP server; auto-distribute to 12+ mainstream agent platforms.
Discover, compare, route, and execute machine-accessible capabilities for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceOne command to turn any codebase into an MCP server. Not just REST APIs. Not just OpenAPI specs.53Apache 2.0
- AlicenseBqualityBmaintenanceA graph-based codebase capability discovery engine for LLM agents, exposing indexed code symbols, signatures, and relationships over MCP to enable agents to find and use tools without guessing names.9BSD 3-Clause
- AlicenseBqualityCmaintenanceConvert plain Python modules into MCP servers without decorators or boilerplate, automatically exposing functions as schematized tools.5MIT
- AlicenseNot gradedqualityCmaintenanceEnables users to turn any API, CLI, database, website, SDK, or codebase into a production-ready MCP server with secure, dynamically discoverable capabilities.MIT