{"name":"Possibility Echo Agent","description":"Echoes back messages for testing A2A connectivity and the Possibility A2A pipeline","url":"https://api.possibility.space/a2a","provider":{"organization":"Possibility","url":"https://possibility.space","documentation":"https://api.possibility.space/a2a","contact":"support@possibility.space"},"version":"0.1.0","capabilities":{"streaming":true,"pushNotifications":false,"stateTransitionHistory":false},"authentication":{"schemes":["Bearer"],"flows":[{"type":"service_token","description":"Service tokens (stok_/ptok_ prefixed) for machine-to-machine auth","token_endpoint":"POST /admin/tokens"},{"type":"oidc_device_flow","description":"OIDC Device Authorization Flow for interactive agents","device_endpoint":"POST /auth/device/code","token_endpoint":"POST /auth/device/token"},{"type":"oidc_jwt","description":"Standard OIDC JWT bearer tokens from the auth provider","issuer":"https://auth.possibility.space/realms/pspace"}]},"defaultInputModes":["text/plain"],"defaultOutputModes":["text/plain","application/json"],"skills":[{"id":"echo","name":"Echo","description":"Echoes back the input message for testing A2A connectivity","tags":["testing","diagnostics"],"examples":["Hello, agent!","Echo this message back to me"]},{"id":"mcp-apis","name":"MCP: apis","description":"Public API catalog: list, search, and read full API definitions","tags":["mcp","apis"]},{"id":"mcp-capabilities","name":"MCP: capabilities","description":"Public capabilities catalog: list, search, and read full capability definitions","tags":["mcp","capabilities"]},{"id":"mcp-examples","name":"MCP: examples","description":"Public examples catalog: list, search, and read full example content","tags":["mcp","examples"]},{"id":"mcp-guides","name":"MCP: guides","description":"Public developer guides catalog: list, search, and read full guide content","tags":["mcp","guides"]},{"id":"mcp-knowledge-base","name":"MCP: knowledge-base","description":"Public knowledge-base catalog: list, search, read architectural and operational entries","tags":["mcp","knowledge-base"]},{"id":"mcp-mcp-servers","name":"MCP: mcp-servers","description":"Public MCP servers catalog: list, search, and read full MCP server definitions","tags":["mcp","mcp-servers"]},{"id":"mcp-public-api","name":"MCP: public-api","description":"Unauthenticated tools: schema discovery, docs, validation","tags":["mcp","public-api"]},{"id":"mcp-quickstarts","name":"MCP: quickstarts","description":"Public quickstarts catalog: list, search, and read full quickstart content","tags":["mcp","quickstarts"]},{"id":"mcp-reference-bundles","name":"MCP: reference-bundles","description":"Public reference bundles catalog: list, search, read curated agent-facing bundles","tags":["mcp","reference-bundles"]},{"id":"mcp-registries","name":"MCP: registries","description":"Public registries catalog: list, search, read canonical pspace registry entities","tags":["mcp","registries"]},{"id":"mcp-rfcs","name":"MCP: rfcs","description":"Public RFC catalog: list, search, and read full RFC content","tags":["mcp","rfcs"]},{"id":"get_organizer_a2a_agent_card","name":"Get the organizer-scoped A2A agent card","description":"Get the organizer-scoped A2A agent card","tags":["api","operation","get","a2a"],"examples":["Invoke GET /.well-known/agent/organizer/{possibilityId}.json (mcp tool: get_organizer_a2a_agent_card)"],"x-pspace-parameters-schema":{"method":"GET","path":"/.well-known/agent/organizer/{possibilityId}.json","mcp_tool":"get_organizer_a2a_agent_card","docs_url":"https://possibility.space/docs/api/a2a-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable Possibility ULID"}}}},{"id":"get_admin_a2a_agent_card","name":"Get the platform-admin A2A agent card","description":"Get the platform-admin A2A agent card","tags":["api","operation","get","a2a"],"examples":["Invoke GET /.well-known/agent/admin.json (mcp tool: get_admin_a2a_agent_card)"],"x-pspace-parameters-schema":{"method":"GET","path":"/.well-known/agent/admin.json","mcp_tool":"get_admin_a2a_agent_card","docs_url":"https://possibility.space/docs/api/a2a-api","properties":{}}},{"id":"admin_list_activities","name":"List activities","description":"List activities","tags":["api","operation","get","activities"],"examples":["Invoke GET /admin/activities (mcp tool: admin_list_activities)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/activities","mcp_tool":"admin_list_activities","properties":{"type":{"type":"string","required":false,"description":"Filter by activity type (e.g., Create, Delete)"},"actorXri":{"type":"string","required":false,"description":"Filter by actor XRI. Persona-anchored events (membership,\nrole changes, possibility-scoped tokens, possibility destroy)\nuse a persona XRI (e.g., `pspace://persona/01HXYZ...`).\nPlatform-anchored events (login/logout, account changes,\nadmin-on-behalf-of) use a user XRI\n(e.g., `pspace://user/01HXYZ...`).\nSee `actor.type` field on returned activities to disambiguate.\n"},"objectXri":{"type":"string","required":false,"description":"Filter by object XRI (e.g., pspace://corpus/01HXYZ...)"},"objectType":{"type":"string","required":false,"description":"Filter by object type (e.g., Corpus, User)"},"sourceService":{"type":"string","required":false,"description":"Filter by source service (e.g., pspace-api)"},"since":{"type":"string","required":false,"description":"ISO timestamp — return activities after this time"},"until":{"type":"string","required":false,"description":"ISO timestamp — return activities before this time"},"limit":{"type":"integer","required":false,"description":"Max results (default 50)"},"offset":{"type":"integer","required":false,"description":"Pagination offset (default 0)"},"order":{"type":"string","required":false,"description":"Sort order (asc or desc, default desc)","enum":["asc","desc"]}},"valid_values":{"order":["asc","desc"]}}},{"id":"admin_get_activity","name":"Get activity by ID","description":"Get activity by ID","tags":["api","operation","get","activities"],"examples":["Invoke GET /admin/activities/{id} (mcp tool: admin_get_activity)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/activities/{id}","mcp_tool":"admin_get_activity","properties":{"id":{"type":"string","required":true,"description":"Activity ID"}}}},{"id":"admin_get_activities_by_actor","name":"Get activities by actor","description":"Get activities by actor","tags":["api","operation","get","activities"],"examples":["Invoke GET /admin/activities/actor/{xri} (mcp tool: admin_get_activities_by_actor)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/activities/actor/{xri}","mcp_tool":"admin_get_activities_by_actor","properties":{"xri":{"type":"string","required":true,"description":"Actor XRI (e.g., pspace://user/01HXYZ...)"}}}},{"id":"list_corpora","name":"List all corpora","description":"Returns all analysis corpora. A corpus defines a collection of source materials (GitHub repos, branches, file paths) to analyze. Each corpus tracks import and conversion status, file counts, and is scoped to a Possibility.","tags":["api","operation","get","analysis-corpora"],"examples":["Invoke GET /corpora (mcp tool: list_corpora)"],"x-pspace-parameters-schema":{"method":"GET","path":"/corpora","mcp_tool":"list_corpora","properties":{}}},{"id":"create_corpus","name":"Create a new corpus","description":"Creates an analysis corpus defining source material to analyze. Requires a name and GitHub source configuration (repo URL, branch, include/exclude paths). The corpus must be imported and transformed before analysis jobs can run against it.","tags":["api","operation","post","analysis-corpora"],"examples":["Invoke POST /corpora (mcp tool: create_corpus)"],"x-pspace-parameters-schema":{"method":"POST","path":"/corpora","mcp_tool":"create_corpus","properties":{"name":{"type":"string","required":true,"description":"Name for the corpus"},"possibility_id":{"type":"string","required":true,"description":"ID of the Possibility this corpus belongs to"},"sources":{"type":"object","required":true,"description":"GitHub source configuration (repo, branch, paths, excludes)"}}}},{"id":"get_corpus","name":"Get corpus by ID","description":"Returns full details of a corpus including its source configuration, import/conversion status, file statistics, and associated possibility.","tags":["api","operation","get","analysis-corpora"],"examples":["Invoke GET /corpora/{id} (mcp tool: get_corpus)"],"x-pspace-parameters-schema":{"method":"GET","path":"/corpora/{id}","mcp_tool":"get_corpus","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"}}}},{"id":"import_corpus","name":"Import corpus content","description":"Triggers import of source files from the configured GitHub repositories into object storage. Runs asynchronously — poll get_import_status for progress. Must complete before corpus can be transformed or analyzed.","tags":["api","operation","post","analysis-corpora"],"examples":["Invoke POST /corpora/{id}/import (mcp tool: import_corpus)"],"x-pspace-parameters-schema":{"method":"POST","path":"/corpora/{id}/import","mcp_tool":"import_corpus","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"}}}},{"id":"get_import_status","name":"Get import status","description":"Returns the current import progress including files discovered, files imported, any errors, and overall completion status (pending, running, completed, failed).","tags":["api","operation","get","analysis-corpora"],"examples":["Invoke GET /corpora/{id}/import-status (mcp tool: get_import_status)"],"x-pspace-parameters-schema":{"method":"GET","path":"/corpora/{id}/import-status","mcp_tool":"get_import_status","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"}}}},{"id":"list_corpus_files","name":"List corpus files","description":"Returns the list of files imported into a corpus, including file paths, sizes, and types. Use after import completes to inspect what source material is available for analysis.","tags":["api","operation","get","analysis-corpora"],"examples":["Invoke GET /corpora/{id}/files (mcp tool: list_corpus_files)"],"x-pspace-parameters-schema":{"method":"GET","path":"/corpora/{id}/files","mcp_tool":"list_corpus_files","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"}}}},{"id":"get_corpus_file_source","name":"Get corpus file source content","description":"Retrieves the raw source content of a specific file within the corpus. The file path is specified as a URL path parameter. Returns the original content as imported from the source repository.","tags":["api","operation","get","analysis-corpora"],"examples":["Invoke GET /corpora/{id}/files/source/{path} (mcp tool: get_corpus_file_source)"],"x-pspace-parameters-schema":{"method":"GET","path":"/corpora/{id}/files/source/{path}","mcp_tool":"get_corpus_file_source","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"},"path":{"type":"string","required":true,"description":"File path within the corpus"}}}},{"id":"check_corpus_staleness","name":"Check corpus staleness","description":"Compares the playbook's source snapshot (commit SHAs at synthesis time) against current repository commits. Returns whether the playbook is stale and which sources have changed since last synthesis.","tags":["api","operation","get","analysis-corpora"],"examples":["Invoke GET /corpora/{id}/staleness (mcp tool: check_corpus_staleness)"],"x-pspace-parameters-schema":{"method":"GET","path":"/corpora/{id}/staleness","mcp_tool":"check_corpus_staleness","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"}}}},{"id":"get_playbook_history","name":"Get playbook history for corpus","description":"Returns version history metadata for the playbook generated from this corpus, including version numbers, creation/modification dates, changelog entries with triggers and summaries, and provenance (source repos, commits, AI model used).","tags":["api","operation","get","analysis-corpora"],"examples":["Invoke GET /corpora/{id}/playbook-history (mcp tool: get_playbook_history)"],"x-pspace-parameters-schema":{"method":"GET","path":"/corpora/{id}/playbook-history","mcp_tool":"get_playbook_history","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"}}}},{"id":"transform_corpus","name":"Transform corpus","description":"Converts raw imported files (markdown, D2 diagrams, YAML, instruction files) into .kno entities. Runs converters for each file type and writes output to Hive storage with change detection. Must complete before analysis jobs can use the corpus.","tags":["api","operation","post","analysis-corpora"],"examples":["Invoke POST /corpora/{id}/transform (mcp tool: transform_corpus)"],"x-pspace-parameters-schema":{"method":"POST","path":"/corpora/{id}/transform","mcp_tool":"transform_corpus","properties":{"id":{"type":"string","required":true,"description":"Corpus ID"}}}},{"id":"admin_list_evals","name":"List all evaluations","description":"List all evaluations","tags":["api","operation","get","analysis-evals"],"examples":["Invoke GET /evals (mcp tool: admin_list_evals)"],"x-pspace-parameters-schema":{"method":"GET","path":"/evals","mcp_tool":"admin_list_evals","properties":{}}},{"id":"admin_create_eval","name":"Create a new evaluation","description":"Create a new evaluation","tags":["api","operation","post","analysis-evals"],"examples":["Invoke POST /evals (mcp tool: admin_create_eval)"],"x-pspace-parameters-schema":{"method":"POST","path":"/evals","mcp_tool":"admin_create_eval","properties":{}}},{"id":"admin_get_eval","name":"Get evaluation by ID","description":"Get evaluation by ID","tags":["api","operation","get","analysis-evals"],"examples":["Invoke GET /evals/{id} (mcp tool: admin_get_eval)"],"x-pspace-parameters-schema":{"method":"GET","path":"/evals/{id}","mcp_tool":"admin_get_eval","properties":{"id":{"type":"string","required":true,"description":"Evaluation ID"}}}},{"id":"admin_run_eval","name":"Run an evaluation","description":"Run an evaluation","tags":["api","operation","post","analysis-evals"],"examples":["Invoke POST /evals/{id}/run (mcp tool: admin_run_eval)"],"x-pspace-parameters-schema":{"method":"POST","path":"/evals/{id}/run","mcp_tool":"admin_run_eval","properties":{"id":{"type":"string","required":true,"description":"Evaluation ID"}}}},{"id":"admin_list_eval_runs","name":"List evaluation runs","description":"List evaluation runs","tags":["api","operation","get","analysis-evals"],"examples":["Invoke GET /evals/{id}/runs (mcp tool: admin_list_eval_runs)"],"x-pspace-parameters-schema":{"method":"GET","path":"/evals/{id}/runs","mcp_tool":"admin_list_eval_runs","properties":{"id":{"type":"string","required":true,"description":"Evaluation ID"}}}},{"id":"admin_get_eval_run","name":"Get evaluation run by ID","description":"Get evaluation run by ID","tags":["api","operation","get","analysis-evals"],"examples":["Invoke GET /eval-runs/{id} (mcp tool: admin_get_eval_run)"],"x-pspace-parameters-schema":{"method":"GET","path":"/eval-runs/{id}","mcp_tool":"admin_get_eval_run","properties":{"id":{"type":"string","required":true,"description":"Evaluation run ID"}}}},{"id":"list_analysis_jobs","name":"List all jobs","description":"Returns all analysis jobs. An analysis job is a multi-phase pipeline that runs dimensional analysis (across 10 analytical lenses) on a corpus, then synthesizes results into a playbook. Each job tracks status, progress, and phase breakdown.","tags":["api","operation","get","analysis-jobs"],"examples":["Invoke GET /jobs (mcp tool: list_analysis_jobs)"],"x-pspace-parameters-schema":{"method":"GET","path":"/jobs","mcp_tool":"list_analysis_jobs","properties":{}}},{"id":"create_analysis_job","name":"Create a new job","description":"Creates an analysis job for a corpus. The corpus must have completed import and transformation. Specify which dimensions (1–10) to analyze and how to partition them into phases.","tags":["api","operation","post","analysis-jobs"],"examples":["Invoke POST /jobs (mcp tool: create_analysis_job)"],"x-pspace-parameters-schema":{"method":"POST","path":"/jobs","mcp_tool":"create_analysis_job","properties":{"corpus_id":{"type":"string","required":true,"description":"ID of the corpus to analyze"},"name":{"type":"string","required":false,"description":"Name for the analysis job"},"dimensions":{"type":"array","required":false,"description":"Dimension numbers (1-10) to analyze"}}}},{"id":"get_analysis_job","name":"Get job by ID","description":"Returns full details of an analysis job including its status, phase configuration, weighted progress (75% dimensional analysis + 25% post-synthesis), associated corpus, and synthesis state.","tags":["api","operation","get","analysis-jobs"],"examples":["Invoke GET /jobs/{id} (mcp tool: get_analysis_job)"],"x-pspace-parameters-schema":{"method":"GET","path":"/jobs/{id}","mcp_tool":"get_analysis_job","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"list_job_runs","name":"List job runs","description":"Returns all dimension runs across all phases of a job. Each run represents one analytical dimension's execution, with status (pending, running, completed, failed), timing, and checkpoint information.","tags":["api","operation","get","analysis-jobs"],"examples":["Invoke GET /jobs/{id}/runs (mcp tool: list_job_runs)"],"x-pspace-parameters-schema":{"method":"GET","path":"/jobs/{id}/runs","mcp_tool":"list_job_runs","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"check_job_readiness","name":"Check job readiness","description":"Pre-flight validation that checks object storage connectivity, corpus files in storage, AI service credentials, and job/corpus data integrity. Must pass before a job can be started. Returns detailed check results.","tags":["api","operation","get","analysis-jobs"],"examples":["Invoke GET /jobs/{id}/readiness (mcp tool: check_job_readiness)"],"x-pspace-parameters-schema":{"method":"GET","path":"/jobs/{id}/readiness","mcp_tool":"check_job_readiness","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"start_analysis_job","name":"Start a job","description":"Initializes a job by creating dimension run records for each phase and setting the job to queued status. Does not execute analysis — use execute_analysis_job or execute phases individually after starting.","tags":["api","operation","post","analysis-jobs"],"examples":["Invoke POST /jobs/{id}/start (mcp tool: start_analysis_job)"],"x-pspace-parameters-schema":{"method":"POST","path":"/jobs/{id}/start","mcp_tool":"start_analysis_job","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"execute_analysis_job","name":"Execute a job","description":"Runs all phases of the job asynchronously with configurable batch size and max files. Processes each dimension through the analytical pipeline with checkpointing for resume capability. Returns immediately with execution status.","tags":["api","operation","post","analysis-jobs"],"examples":["Invoke POST /jobs/{id}/execute (mcp tool: execute_analysis_job)"],"x-pspace-parameters-schema":{"method":"POST","path":"/jobs/{id}/execute","mcp_tool":"execute_analysis_job","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"resume_analysis_job","name":"Resume a paused job","description":"Resumes a job that was paused or partially completed. Picks up from the last checkpoint, preserving completed dimension runs and continuing from where execution left off.","tags":["api","operation","post","analysis-jobs"],"examples":["Invoke POST /jobs/{id}/resume (mcp tool: resume_analysis_job)"],"x-pspace-parameters-schema":{"method":"POST","path":"/jobs/{id}/resume","mcp_tool":"resume_analysis_job","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"synthesize_job","name":"Synthesize job results","description":"Runs the 6-step synthesis pipeline on completed dimensional analysis: load results, run 10 contextual lens passes, cross-lens meta-synthesis, extract principles/procedures/patterns, assemble into a .kno playbook, and evaluate quality. Supports step-level resume.","tags":["api","operation","post","analysis-jobs"],"examples":["Invoke POST /jobs/{id}/synthesize (mcp tool: synthesize_job)"],"x-pspace-parameters-schema":{"method":"POST","path":"/jobs/{id}/synthesize","mcp_tool":"synthesize_job","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"evaluate_job","name":"Evaluate a job","description":"Re-runs the quality evaluation step of synthesis on a completed playbook. Resets the evaluate and promote steps, then re-executes them to produce updated quality scores and metrics.","tags":["api","operation","post","analysis-jobs"],"examples":["Invoke POST /jobs/{id}/evaluate (mcp tool: evaluate_job)"],"x-pspace-parameters-schema":{"method":"POST","path":"/jobs/{id}/evaluate","mcp_tool":"evaluate_job","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"generate_components","name":"Generate components from job","description":"Derives glossary and workflow .kno entities from a completed playbook. Extracts terms and procedures from the playbook content, generates individual .kno files for each, and writes them to the Hive output path. Requires job to be in completed status.","tags":["api","operation","post","analysis-jobs"],"examples":["Invoke POST /jobs/{id}/generate-components (mcp tool: generate_components)"],"x-pspace-parameters-schema":{"method":"POST","path":"/jobs/{id}/generate-components","mcp_tool":"generate_components","properties":{"id":{"type":"string","required":true,"description":"Job ID"}}}},{"id":"list_analysis_phases","name":"List all phases","description":"Returns all phases for an analysis job. Each phase groups a subset of the 10 analytical dimensions, has a phase number, and tracks its own execution status and dimension runs.","tags":["api","operation","get","analysis-phases"],"examples":["Invoke GET /phases (mcp tool: list_analysis_phases)"],"x-pspace-parameters-schema":{"method":"GET","path":"/phases","mcp_tool":"list_analysis_phases","properties":{}}},{"id":"create_analysis_phase","name":"Create a new phase","description":"Creates a phase within an analysis job. Specify which dimensions (1–10) to assign, file filters, and phase ordering. Phases partition the analytical work so dimensions can be executed in batches.","tags":["api","operation","post","analysis-phases"],"examples":["Invoke POST /phases (mcp tool: create_analysis_phase)"],"x-pspace-parameters-schema":{"method":"POST","path":"/phases","mcp_tool":"create_analysis_phase","properties":{"job_id":{"type":"string","required":true,"description":"ID of the analysis job"},"dimensions":{"type":"array","required":true,"description":"Dimension numbers (1-10) to assign to this phase"},"phase_number":{"type":"integer","required":false,"description":"Phase ordering number"}}}},{"id":"get_analysis_phase","name":"Get phase by ID","description":"Returns full details of a phase including its assigned dimensions, file filters, execution status, and associated dimension run results.","tags":["api","operation","get","analysis-phases"],"examples":["Invoke GET /phases/{id} (mcp tool: get_analysis_phase)"],"x-pspace-parameters-schema":{"method":"GET","path":"/phases/{id}","mcp_tool":"get_analysis_phase","properties":{"id":{"type":"string","required":true,"description":"Phase ID"}}}},{"id":"start_analysis_phase","name":"Start a phase","description":"Initializes dimension run records for each dimension assigned to this phase and sets the phase to running status. Must be called before execute.","tags":["api","operation","post","analysis-phases"],"examples":["Invoke POST /phases/{id}/start (mcp tool: start_analysis_phase)"],"x-pspace-parameters-schema":{"method":"POST","path":"/phases/{id}/start","mcp_tool":"start_analysis_phase","properties":{"id":{"type":"string","required":true,"description":"Phase ID"}}}},{"id":"execute_analysis_phase","name":"Execute a phase","description":"Runs all assigned dimensions asynchronously through the analytical pipeline with configurable batch size and max files per dimension. Each dimension processes corpus files through its analytical lens with checkpointing.","tags":["api","operation","post","analysis-phases"],"examples":["Invoke POST /phases/{id}/execute (mcp tool: execute_analysis_phase)"],"x-pspace-parameters-schema":{"method":"POST","path":"/phases/{id}/execute","mcp_tool":"execute_analysis_phase","properties":{"id":{"type":"string","required":true,"description":"Phase ID"}}}},{"id":"retry_failed_phase","name":"Retry failed phase runs","description":"Re-executes only the dimension runs that failed within this phase, preserving completed dimension results. Useful for recovering from transient errors without redoing successful work.","tags":["api","operation","post","analysis-phases"],"examples":["Invoke POST /phases/{id}/retry-failed (mcp tool: retry_failed_phase)"],"x-pspace-parameters-schema":{"method":"POST","path":"/phases/{id}/retry-failed","mcp_tool":"retry_failed_phase","properties":{"id":{"type":"string","required":true,"description":"Phase ID"}}}},{"id":"list_phase_runs","name":"List phase runs","description":"Returns all dimension runs for a specific phase. Each run represents one dimension's execution with status (pending, running, completed, failed), timing data, and result references.","tags":["api","operation","get","analysis-phases"],"examples":["Invoke GET /phases/{id}/runs (mcp tool: list_phase_runs)"],"x-pspace-parameters-schema":{"method":"GET","path":"/phases/{id}/runs","mcp_tool":"list_phase_runs","properties":{"id":{"type":"string","required":true,"description":"Phase ID"}}}},{"id":"get_phase_run","name":"Get a specific dimension run","description":"Returns full details of a single dimension run including its analytical dimension number, execution status, timing, checkpoint data, and result references in object storage.","tags":["api","operation","get","analysis-phases"],"examples":["Invoke GET /runs/{id} (mcp tool: get_phase_run)"],"x-pspace-parameters-schema":{"method":"GET","path":"/runs/{id}","mcp_tool":"get_phase_run","properties":{"id":{"type":"string","required":true,"description":"Run ID"}}}},{"id":"describe_capability_config","name":"Describe a capability's config surface — secret-store keys and non-secret config variables","description":"Derive the variables an installed capability declares in its own manifest: secret-store keys (presence-only, `generated: true` marks platform-minted) and non-secret config variables (`required`, `default`, `format: string|url|enum`, `enum`), each tagged `kind: secret | config`, with the atom's `path_template` and the capability's `required_permissions`. Non-conforming manifests degrade with a `degrade_reason`, never a 5xx.","tags":["api","operation","get","capabilities-config"],"examples":["Invoke GET /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/config (mcp tool: describe_capability_config)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/config","mcp_tool":"describe_capability_config","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability"}}}},{"id":"get_capability_config_status","name":"Get config status — presence only for secrets, value included for non-secret config variables","description":"For every declared variable, whether a value is stored at the atom's resolved path. Secret-store keys return `set` only — no response shape carries a secret value. Non-secret config variables also return their `value` when set, plus `required` and `default`. `missing_count` counts unset user-supplied secrets and unset required config variables without a default. An unreachable store degrades the atom to `status: unknown`.","tags":["api","operation","get","capabilities-config"],"examples":["Invoke GET /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/config/status (mcp tool: get_capability_config_status)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/config/status","mcp_tool":"get_capability_config_status","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability"}}}},{"id":"set_capability_config_variable","name":"Set a config variable — a user-supplied secret or a non-secret config value","description":"Write `{ value }` for one variable the capability's manifest declares into the atom's declared path (read-merge-write; siblings survive). Secret-store keys without `generated: true` and every config variable are writable; a config value must satisfy its declared `format` (`url`: absolute http(s) URL; `enum`: one of `enum[]`). Undeclared key → 404; platform-minted key or format violation → 422; store unavailable → 503. The value is never logged and never echoed.","tags":["api","operation","put","capabilities-config"],"examples":["Invoke PUT /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/config/{key} (mcp tool: set_capability_config_variable)"],"x-pspace-parameters-schema":{"method":"PUT","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/config/{key}","mcp_tool":"set_capability_config_variable","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability"},"key":{"type":"string","required":true,"description":"A variable key the capability's manifest declares — a secret-store key without generated: true, or a config variable"}}}},{"id":"get_external_capability_token","name":"Get external capability token info","description":"Get external capability token info","tags":["api","operation","get","capabilities-install"],"examples":["Invoke GET /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/token (mcp tool: get_external_capability_token)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/token","mcp_tool":"get_external_capability_token","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Installed external capability slug"}}}},{"id":"list_installed_capabilities","name":"List installed capabilities","description":"List installed capabilities","tags":["api","operation","get","capabilities-lifecycle"],"examples":["Invoke GET /admin/possibilities/{possibilityId}/capabilities (mcp tool: list_installed_capabilities)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/possibilities/{possibilityId}/capabilities","mcp_tool":"list_installed_capabilities","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"lifecycle":{"type":"string","required":false,"description":"`active` (default) withholds `uninstalled` records; `all` returns every lifecycle record including history"}}}},{"id":"get_external_capability_artifacts","name":"Get external artifact A2UI surface","description":"Get external artifact A2UI surface","tags":["api","operation","get","capabilities-lifecycle"],"examples":["Invoke GET /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/surface/artifacts (mcp tool: get_external_capability_artifacts)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/surface/artifacts","mcp_tool":"get_external_capability_artifacts","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Installed capability slug"},"taskId":{"type":"string","required":true,"description":"A2A task ID whose artifacts to render"}}}},{"id":"initiate_publisher_verification","name":"Initiate domain verification","description":"Initiate domain verification","tags":["api","operation","post","capabilities-publisher-verification"],"examples":["Invoke POST / (mcp tool: initiate_publisher_verification)"],"x-pspace-parameters-schema":{"method":"POST","path":"/","mcp_tool":"initiate_publisher_verification","properties":{}}},{"id":"list_publisher_verifications","name":"List publisher domain verifications","description":"List publisher domain verifications","tags":["api","operation","get","capabilities-publisher-verification"],"examples":["Invoke GET / (mcp tool: list_publisher_verifications)"],"x-pspace-parameters-schema":{"method":"GET","path":"/","mcp_tool":"list_publisher_verifications","properties":{}}},{"id":"get_publisher_verification","name":"Get domain verification status","description":"Get domain verification status","tags":["api","operation","get","capabilities-publisher-verification"],"examples":["Invoke GET /:id (mcp tool: get_publisher_verification)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:id","mcp_tool":"get_publisher_verification","properties":{}}},{"id":"check_publisher_verification","name":"Trigger DNS verification check","description":"Trigger DNS verification check","tags":["api","operation","post","capabilities-publisher-verification"],"examples":["Invoke POST /:id/check (mcp tool: check_publisher_verification)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:id/check","mcp_tool":"check_publisher_verification","properties":{}}},{"id":"get_publisher_verification_dns","name":"Get DNS instructions for verification","description":"Get DNS instructions for verification","tags":["api","operation","get","capabilities-publisher-verification"],"examples":["Invoke GET /:id/dns (mcp tool: get_publisher_verification_dns)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:id/dns","mcp_tool":"get_publisher_verification_dns","properties":{}}},{"id":"collections_list","name":"List a collection","description":"Enumerate every public entity in `{collection}`. Pagination\nuses opaque cursors — pass `next_cursor` from one page as\n`cursor` on the next.\n","tags":["api","operation","get","collections"],"examples":["Invoke GET /v1/{collection} (mcp tool: collections_list)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/{collection}","mcp_tool":"collections_list","docs_url":"https://possibility.space/docs/api/collections-api","properties":{"collection":{"type":"string","required":true,"description":"Collection name (e.g., 'guides', 'rfcs', 'capabilities')"},"limit":{"type":"integer","required":false,"description":"Page size (default 25, max 100)"},"cursor":{"type":"string","required":false,"description":"Opaque cursor from a previous page's `next_cursor`"}}}},{"id":"collections_search","name":"Search a collection","description":"Substring search across slug/title/description with relevance\nranking (slug-exact > slug-substring > title > description).\n","tags":["api","operation","get","collections"],"examples":["Invoke GET /v1/{collection}/search (mcp tool: collections_search)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/{collection}/search","mcp_tool":"collections_search","docs_url":"https://possibility.space/docs/api/collections-api","properties":{"collection":{"type":"string","required":true,"description":"Collection name"},"q":{"type":"string","required":true,"description":"Search substring (case-insensitive)"},"limit":{"type":"integer","required":false,"description":"Page size (default 25, max 100)"},"cursor":{"type":"string","required":false,"description":"Opaque cursor from a previous page's `next_cursor`"}}}},{"id":"collections_get_by_slug","name":"Get entity by slug","description":"Fetch a single public entity from `{collection}` by `{slug}`.\nThe response includes the entity's Identity XRI\n(`pspace://{collection}/{ULID}`) so MCP / A2A callers can\nresolve to the same entity by construction (RFC-013).\n","tags":["api","operation","get","collections"],"examples":["Invoke GET /v1/{collection}/{slug} (mcp tool: collections_get_by_slug)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/{collection}/{slug}","mcp_tool":"collections_get_by_slug","docs_url":"https://possibility.space/docs/api/collections-api","properties":{"collection":{"type":"string","required":true,"description":"Collection name"},"slug":{"type":"string","required":true,"description":"Entity slug"},"raw":{"type":"boolean","required":false,"description":"If true, return only the parsed .kno source (no envelope)"}}}},{"id":"list_connections","name":"List connections","description":"List connections","tags":["api","operation","get","connections"],"examples":["Invoke GET / (mcp tool: list_connections)"],"x-pspace-parameters-schema":{"method":"GET","path":"/","mcp_tool":"list_connections","docs_url":"https://possibility.space/docs/api/connections-api","properties":{}}},{"id":"list_github_repos","name":"List GitHub repositories","description":"List GitHub repositories","tags":["api","operation","get","connections"],"examples":["Invoke GET /github/repos (mcp tool: list_github_repos)"],"x-pspace-parameters-schema":{"method":"GET","path":"/github/repos","mcp_tool":"list_github_repos","docs_url":"https://possibility.space/docs/api/connections-api","properties":{}}},{"id":"connectors_list_factories","name":"List connector factories","description":"List connector factories","tags":["api","operation","get","connectors"],"examples":["Invoke GET /admin/connectors/factories (mcp tool: connectors_list_factories)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/connectors/factories","mcp_tool":"connectors_list_factories","properties":{}}},{"id":"connectors_list","name":"List connectors","description":"List connectors","tags":["api","operation","get","connectors"],"examples":["Invoke GET /admin/connectors (mcp tool: connectors_list)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/connectors","mcp_tool":"connectors_list","properties":{}}},{"id":"connectors_get","name":"Get connector by ID","description":"Get connector by ID","tags":["api","operation","get","connectors"],"examples":["Invoke GET /admin/connectors/{id} (mcp tool: connectors_get)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/connectors/{id}","mcp_tool":"connectors_get","properties":{"id":{"type":"string","required":true,"description":"Connector ID (matches .kno file name)"}}}},{"id":"admin_list_data_collections","name":"List all collections (admin)","description":"List all collections (admin)","tags":["api","operation","get","data-admin"],"examples":["Invoke GET /:possibilityId/data (mcp tool: admin_list_data_collections)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data","mcp_tool":"admin_list_data_collections","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_create_data_collection","name":"Create a new collection (admin)","description":"Create a new collection (admin)","tags":["api","operation","post","data-admin"],"examples":["Invoke POST /:possibilityId/data (mcp tool: admin_create_data_collection)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data","mcp_tool":"admin_create_data_collection","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_get_data_storage_stats","name":"Get global storage stats (admin)","description":"Get global storage stats (admin)","tags":["api","operation","get","data-admin"],"examples":["Invoke GET /:possibilityId/data/_meta (mcp tool: admin_get_data_storage_stats)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/_meta","mcp_tool":"admin_get_data_storage_stats","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_get_data_collection_stats","name":"Get collection stats (admin)","description":"Get collection stats (admin)","tags":["api","operation","get","data-admin"],"examples":["Invoke GET /:possibilityId/data/_meta/:collection (mcp tool: admin_get_data_collection_stats)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/_meta/:collection","mcp_tool":"admin_get_data_collection_stats","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"}}}},{"id":"admin_list_data_records","name":"List records in a collection (admin)","description":"List records in a collection (admin)","tags":["api","operation","get","data-admin"],"examples":["Invoke GET /:possibilityId/data/:collection (mcp tool: admin_list_data_records)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/:collection","mcp_tool":"admin_list_data_records","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"}}}},{"id":"admin_create_data_record","name":"Create a new record (admin)","description":"Create a new record (admin)","tags":["api","operation","post","data-admin"],"examples":["Invoke POST /:possibilityId/data/:collection (mcp tool: admin_create_data_record)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data/:collection","mcp_tool":"admin_create_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"}}}},{"id":"admin_batch_upsert_data_records","name":"Batch upsert records (admin)","description":"Batch upsert records (admin)","tags":["api","operation","post","data-admin"],"examples":["Invoke POST /:possibilityId/data/:collection/batch (mcp tool: admin_batch_upsert_data_records)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data/:collection/batch","mcp_tool":"admin_batch_upsert_data_records","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"}}}},{"id":"admin_query_data_records","name":"Query records with filters (admin)","description":"Query records with filters (admin)","tags":["api","operation","post","data-admin"],"examples":["Invoke POST /:possibilityId/data/:collection/query (mcp tool: admin_query_data_records)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data/:collection/query","mcp_tool":"admin_query_data_records","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"}}}},{"id":"admin_get_data_record","name":"Get a record by key (admin)","description":"Get a record by key (admin)","tags":["api","operation","get","data-admin"],"examples":["Invoke GET /:possibilityId/data/:collection/:key (mcp tool: admin_get_data_record)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/:collection/:key","mcp_tool":"admin_get_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"}}}},{"id":"admin_upsert_data_record","name":"Full replace / upsert (admin)","description":"Full replace / upsert (admin)","tags":["api","operation","put","data-admin"],"examples":["Invoke PUT /:possibilityId/data/:collection/:key (mcp tool: admin_upsert_data_record)"],"x-pspace-parameters-schema":{"method":"PUT","path":"/:possibilityId/data/:collection/:key","mcp_tool":"admin_upsert_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"}}}},{"id":"admin_patch_data_record","name":"Partial update / JSONB merge (admin)","description":"Partial update / JSONB merge (admin)","tags":["api","operation","patch","data-admin"],"examples":["Invoke PATCH /:possibilityId/data/:collection/:key (mcp tool: admin_patch_data_record)"],"x-pspace-parameters-schema":{"method":"PATCH","path":"/:possibilityId/data/:collection/:key","mcp_tool":"admin_patch_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"}}}},{"id":"admin_delete_data_record","name":"Delete a record (admin)","description":"Delete a record (admin)","tags":["api","operation","delete","data-admin"],"examples":["Invoke DELETE /:possibilityId/data/:collection/:key (mcp tool: admin_delete_data_record)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/data/:collection/:key","mcp_tool":"admin_delete_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"}}}},{"id":"list_data_collections","name":"List all collections (paginated)","description":"Returns a paginated list of KV collections with denormalized counts (record_count, total_size_bytes).\n","tags":["api","operation","get","data"],"examples":["Invoke GET /:possibilityId/data (mcp tool: list_data_collections)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data","mcp_tool":"list_data_collections","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"limit":{"type":"integer","required":false,"description":"Page size (1–100, default: 20)"},"offset":{"type":"integer","required":false,"description":"Skip N records (default: 0)"},"sort":{"type":"string","required":false,"description":"Sort field: created_at | updated_at (default: created_at)"},"order":{"type":"string","required":false,"description":"Sort order: asc | desc (default: desc)"}}}},{"id":"create_data_collection","name":"Create a new collection","description":"Creates a named KV collection. Name must be unique within the Possibility and match [a-zA-Z0-9_-]+ (max 64 chars). Returns 422 if the 50-collection limit would be exceeded.\n","tags":["api","operation","post","data"],"examples":["Invoke POST /:possibilityId/data (mcp tool: create_data_collection)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data","mcp_tool":"create_data_collection","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"name":{"type":"string","required":true,"description":"required, max 64, regex: [a-zA-Z0-9_-]+"},"description":{"type":"string","required":false,"description":"optional, max 500"},"acl":{"type":"object","required":false}}}},{"id":"list_data_records","name":"List records in a collection (paginated)","description":"Returns a paginated list of records. Use the query endpoint for filtered searches.\n","tags":["api","operation","get","data"],"examples":["Invoke GET /:possibilityId/data/:collection (mcp tool: list_data_records)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/:collection","mcp_tool":"list_data_records","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"limit":{"type":"integer","required":false,"description":"Page size (1–100, default: 20)"},"offset":{"type":"integer","required":false,"description":"Skip N records (default: 0)"},"sort":{"type":"string","required":false,"description":"Sort field: created_at | updated_at | key (default: created_at)"},"order":{"type":"string","required":false,"description":"Sort order: asc | desc (default: desc)"}}}},{"id":"create_data_record","name":"Create a new record","description":"Creates a record with a unique key. Returns 409 if the key already exists (use PUT for upsert). Returns 422 if the 100K record limit would be exceeded, or 413 if total storage would exceed 100 MB.\n","tags":["api","operation","post","data"],"examples":["Invoke POST /:possibilityId/data/:collection (mcp tool: create_data_record)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data/:collection","mcp_tool":"create_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"required, max 255"},"data":{"type":"object","required":true,"description":"required, JSONB, max 256 KB"},"metadata":{"type":"object","required":false,"description":"optional, JSONB"}}}},{"id":"get_data_record","name":"Get a record by key","description":"Get a record by key","tags":["api","operation","get","data"],"examples":["Invoke GET /:possibilityId/data/:collection/:key (mcp tool: get_data_record)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/:collection/:key","mcp_tool":"get_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"}}}},{"id":"upsert_data_record","name":"Full replace (upsert)","description":"Replaces the entire record data if the key exists (200), or creates a new record if it doesn't (201). Atomically updates collection size counters.\n","tags":["api","operation","put","data"],"examples":["Invoke PUT /:possibilityId/data/:collection/:key (mcp tool: upsert_data_record)"],"x-pspace-parameters-schema":{"method":"PUT","path":"/:possibilityId/data/:collection/:key","mcp_tool":"upsert_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"},"data":{"type":"object","required":true,"description":"required, JSONB, max 256 KB"},"metadata":{"type":"object","required":false,"description":"optional, JSONB"}}}},{"id":"patch_data_record","name":"Partial update (JSONB merge)","description":"Merges the provided fields into the existing record's data and/or metadata via JSONB concatenation (||). Post-merge size is validated against limits.\n","tags":["api","operation","patch","data"],"examples":["Invoke PATCH /:possibilityId/data/:collection/:key (mcp tool: patch_data_record)"],"x-pspace-parameters-schema":{"method":"PATCH","path":"/:possibilityId/data/:collection/:key","mcp_tool":"patch_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"},"data":{"type":"object","required":false,"description":"optional, fields to merge"},"metadata":{"type":"object","required":false,"description":"optional, fields to merge"}}}},{"id":"delete_data_record","name":"Delete a record","description":"Hard-deletes the record and atomically decrements the collection's record_count and total_size_bytes counters.\n","tags":["api","operation","delete","data"],"examples":["Invoke DELETE /:possibilityId/data/:collection/:key (mcp tool: delete_data_record)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/data/:collection/:key","mcp_tool":"delete_data_record","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"key":{"type":"string","required":true,"description":"Record key"}}}},{"id":"batch_upsert_data_records","name":"Batch upsert records","description":"Upserts up to 100 records in a single request. Each record is processed independently — partial failure returns 207 with per-record error details. Returns 200 on full success.\n","tags":["api","operation","post","data"],"examples":["Invoke POST /:possibilityId/data/:collection/batch (mcp tool: batch_upsert_data_records)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data/:collection/batch","mcp_tool":"batch_upsert_data_records","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"records":{"type":"object","required":false}}}},{"id":"query_data_records","name":"Query records with filters","description":"Queries records in a collection using JSONB filter operators. Supports $eq (implicit), $gt, $gte, $lt, $lte, $in, and $contains. Filter paths must start with \"data.\" and have max depth 3. Up to 10 filters per query.\n","tags":["api","operation","post","data"],"examples":["Invoke POST /:possibilityId/data/:collection/query (mcp tool: query_data_records)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/data/:collection/query","mcp_tool":"query_data_records","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"},"filters":{"type":"object","required":false},"limit":{"type":"number","required":false,"description":"1–100, default: 20"},"offset":{"type":"number","required":false,"description":"default: 0"},"sort":{"type":"string","required":false,"description":"default: created_at"},"order":{"type":"string","required":false,"description":"default: desc"}}}},{"id":"get_data_storage_stats","name":"Get global storage stats","description":"Get global storage stats","tags":["api","operation","get","data"],"examples":["Invoke GET /:possibilityId/data/_meta (mcp tool: get_data_storage_stats)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/_meta","mcp_tool":"get_data_storage_stats","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"get_data_collection_stats","name":"Get collection stats","description":"Get collection stats","tags":["api","operation","get","data"],"examples":["Invoke GET /:possibilityId/data/_meta/:collection (mcp tool: get_data_collection_stats)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/data/_meta/:collection","mcp_tool":"get_data_collection_stats","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"collection":{"type":"string","required":true,"description":"Collection name"}}}},{"id":"refresh_access_token","name":"Retry token issuance via refresh — resume a previously-authenticated session after access_token expiry","description":"Retry token issuance via refresh — resume a previously-authenticated session after access_token expiry","tags":["api","operation","post","device-flow"],"examples":["Invoke POST /token/refresh (mcp tool: refresh_access_token)"],"x-pspace-parameters-schema":{"method":"POST","path":"/token/refresh","mcp_tool":"refresh_access_token","docs_url":"https://possibility.space/docs/api/device-flow-api","properties":{"refresh_token":{"type":"string","required":true,"description":"The refresh_token from a previous token response"},"client_id":{"type":"string","required":false,"description":"Must match the client_id used in the original authorize request.\nRoutes token refresh to the correct per-possibility auth zone.\n"}}}},{"id":"api_index","name":"List all REST + MCP routes the caller can reach","description":"List all REST + MCP routes the caller can reach","tags":["api","operation","get","docs"],"examples":["Invoke GET /admin/api-index (mcp tool: api_index)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/api-index","mcp_tool":"api_index","properties":{}}},{"id":"admin_integration_guide","name":"List the admin REST integration surface","description":"List the admin REST integration surface","tags":["api","operation","get","docs"],"examples":["Invoke GET /admin/integration-guide (mcp tool: admin_integration_guide)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/integration-guide","mcp_tool":"admin_integration_guide","properties":{}}},{"id":"admin_list_entities","name":"List entities in any possibility","description":"List entities in any possibility","tags":["api","operation","get","entities-admin"],"examples":["Invoke GET /:possibilityId/entities (mcp tool: admin_list_entities)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities","mcp_tool":"admin_list_entities","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"knoType":{"type":"string","required":false,"description":"Filter by entity type"},"sourceType":{"type":"string","required":false,"description":"Filter by source: manual, inference, import"},"limit":{"type":"integer","required":false,"description":"Max results (1-100, default 50)"},"offset":{"type":"integer","required":false,"description":"Pagination offset (default 0)"}}}},{"id":"admin_create_entity","name":"Create entity in any possibility","description":"Create entity in any possibility","tags":["api","operation","post","entities-admin"],"examples":["Invoke POST /:possibilityId/entities (mcp tool: admin_create_entity)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/entities","mcp_tool":"admin_create_entity","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"admin_get_entity","name":"Get entity from any possibility","description":"Get entity from any possibility","tags":["api","operation","get","entities-admin"],"examples":["Invoke GET /:possibilityId/entities/:entityId (mcp tool: admin_get_entity)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId","mcp_tool":"admin_get_entity","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"includeContent":{"type":"string","required":false,"description":"If 'true', fetch raw YAML content"}}}},{"id":"admin_update_entity","name":"Update entity in any possibility","description":"Update entity in any possibility","tags":["api","operation","patch","entities-admin"],"examples":["Invoke PATCH /:possibilityId/entities/:entityId (mcp tool: admin_update_entity)"],"x-pspace-parameters-schema":{"method":"PATCH","path":"/:possibilityId/entities/:entityId","mcp_tool":"admin_update_entity","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"}}}},{"id":"admin_delete_entity","name":"Delete entity from any possibility","description":"Delete entity from any possibility","tags":["api","operation","delete","entities-admin"],"examples":["Invoke DELETE /:possibilityId/entities/:entityId (mcp tool: admin_delete_entity)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/entities/:entityId","mcp_tool":"admin_delete_entity","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"}}}},{"id":"admin_list_entity_versions","name":"List versions for entity in any possibility","description":"List versions for entity in any possibility","tags":["api","operation","get","entities-admin"],"examples":["Invoke GET /:possibilityId/entities/:entityId/versions (mcp tool: admin_list_entity_versions)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/versions","mcp_tool":"admin_list_entity_versions","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"limit":{"type":"integer","required":false,"description":"Max results per page (1-100, default 50)"},"offset":{"type":"integer","required":false,"description":"Pagination offset (default 0)"},"after":{"type":"string","required":false,"description":"Only versions after this ISO 8601 timestamp"},"before":{"type":"string","required":false,"description":"Only versions before this ISO 8601 timestamp"}}}},{"id":"admin_get_entity_version","name":"Get entity at specific version from any possibility","description":"Get entity at specific version from any possibility","tags":["api","operation","get","entities-admin"],"examples":["Invoke GET /:possibilityId/entities/:entityId/versions/:ref (mcp tool: admin_get_entity_version)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/versions/:ref","mcp_tool":"admin_get_entity_version","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"ref":{"type":"string","required":true,"description":"Version reference (backend-specific, typically ULID)"}}}},{"id":"admin_diff_entity_versions","name":"Diff two versions of entity in any possibility","description":"Diff two versions of entity in any possibility","tags":["api","operation","get","entities-admin"],"examples":["Invoke GET /:possibilityId/entities/:entityId/diff (mcp tool: admin_diff_entity_versions)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/diff","mcp_tool":"admin_diff_entity_versions","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"from":{"type":"string","required":true,"description":"Starting version ref"},"to":{"type":"string","required":true,"description":"Ending version ref"}}}},{"id":"admin_get_entity_at_time","name":"Get entity state at timestamp from any possibility","description":"Get entity state at timestamp from any possibility","tags":["api","operation","get","entities-admin"],"examples":["Invoke GET /:possibilityId/entities/:entityId/at (mcp tool: admin_get_entity_at_time)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/at","mcp_tool":"admin_get_entity_at_time","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"timestamp":{"type":"string","required":true,"description":"ISO 8601 timestamp"}}}},{"id":"list_entities","name":"List entities","description":"List entities","tags":["api","operation","get","entities"],"examples":["Invoke GET /:possibilityId/entities (mcp tool: list_entities)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities","mcp_tool":"list_entities","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"knoType":{"type":"string","required":false,"description":"Filter by entity type (e.g., role, playbook, connector)"},"sourceType":{"type":"string","required":false,"description":"Filter by source: manual, inference, import"},"limit":{"type":"integer","required":false,"description":"Max results per page (1-100, default 50)"},"offset":{"type":"integer","required":false,"description":"Pagination offset (default 0)"}}}},{"id":"create_entity","name":"Create entity","description":"Create entity","tags":["api","operation","post","entities"],"examples":["Invoke POST /:possibilityId/entities (mcp tool: create_entity)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/entities","mcp_tool":"create_entity","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"body":{"type":"object","required":true,"description":"JSON: { knoId, knoType, content, ... } or raw YAML body.\nSee CreateEntitySchema for full field list.\n"}}}},{"id":"get_entity","name":"Get entity","description":"Get entity","tags":["api","operation","get","entities"],"examples":["Invoke GET /:possibilityId/entities/:entityId (mcp tool: get_entity)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId","mcp_tool":"get_entity","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"includeContent":{"type":"string","required":false,"description":"If 'true', fetch raw YAML content from object storage"}}}},{"id":"update_entity","name":"Update entity","description":"Update entity","tags":["api","operation","patch","entities"],"examples":["Invoke PATCH /:possibilityId/entities/:entityId (mcp tool: update_entity)"],"x-pspace-parameters-schema":{"method":"PATCH","path":"/:possibilityId/entities/:entityId","mcp_tool":"update_entity","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"body":{"type":"object","required":true,"description":"{ slug?, title?, description?, content? }\nSee UpdateEntitySchema for validation rules.\n"}}}},{"id":"delete_entity","name":"Delete entity","description":"Delete entity","tags":["api","operation","delete","entities"],"examples":["Invoke DELETE /:possibilityId/entities/:entityId (mcp tool: delete_entity)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/entities/:entityId","mcp_tool":"delete_entity","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"}}}},{"id":"restore_entity_version","name":"Restore entity revision","description":"Restore entity revision","tags":["api","operation","post","entities"],"examples":["Invoke POST /:possibilityId/entities/:entityId/restore (mcp tool: restore_entity_version)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/entities/:entityId/restore","mcp_tool":"restore_entity_version","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"ref":{"type":"string","required":true,"description":"Version reference to restore (as returned by the versions listing)"}}}},{"id":"list_entity_versions","name":"List versions","description":"List versions","tags":["api","operation","get","entities"],"examples":["Invoke GET /:possibilityId/entities/:entityId/versions (mcp tool: list_entity_versions)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/versions","mcp_tool":"list_entity_versions","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"limit":{"type":"integer","required":false,"description":"Max results per page (1-100, default 50)"},"offset":{"type":"integer","required":false,"description":"Pagination offset (default 0)"},"after":{"type":"string","required":false,"description":"Only versions after this ISO 8601 timestamp"},"before":{"type":"string","required":false,"description":"Only versions before this ISO 8601 timestamp"}}}},{"id":"get_entity_version","name":"Get version","description":"Get version","tags":["api","operation","get","entities"],"examples":["Invoke GET /:possibilityId/entities/:entityId/versions/:ref (mcp tool: get_entity_version)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/versions/:ref","mcp_tool":"get_entity_version","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"ref":{"type":"string","required":true,"description":"Version reference (backend-specific, typically ULID)"}}}},{"id":"diff_entity_versions","name":"Diff versions","description":"Diff versions","tags":["api","operation","get","entities"],"examples":["Invoke GET /:possibilityId/entities/:entityId/diff (mcp tool: diff_entity_versions)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/diff","mcp_tool":"diff_entity_versions","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"from":{"type":"string","required":true,"description":"Starting version ref"},"to":{"type":"string","required":true,"description":"Ending version ref"}}}},{"id":"get_entity_at_time","name":"Time-travel query","description":"Time-travel query","tags":["api","operation","get","entities"],"examples":["Invoke GET /:possibilityId/entities/:entityId/at (mcp tool: get_entity_at_time)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entities/:entityId/at","mcp_tool":"get_entity_at_time","docs_url":"https://possibility.space/docs/api/entities-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"entityId":{"type":"string","required":true,"description":"Canonical ULID of the entity"},"timestamp":{"type":"string","required":true,"description":"ISO 8601 timestamp"}}}},{"id":"query_entity_candidates","name":"Suggest candidate people-shaped entities","description":"Suggest candidate people-shaped entities","tags":["api","operation","post","entity-graph"],"examples":["Invoke POST /:possibilityId/entity-candidates/query (mcp tool: query_entity_candidates)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/entity-candidates/query","mcp_tool":"query_entity_candidates","docs_url":"https://possibility.space/docs/api/entity-graph-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"query":{"type":"string","required":true,"description":"Candidate search text (1–64 chars); matched case-insensitively against display labels"},"types":{"type":"array","required":false,"description":"Restrict candidate entity types (subset of: user, persona, helper); defaults to all three"},"limit":{"type":"number","required":false,"description":"Maximum candidates to return (1–25, default 10)"}}}},{"id":"list_entity_references","name":"List hosts referencing a target","description":"List hosts referencing a target","tags":["api","operation","get","entity-graph"],"examples":["Invoke GET /:possibilityId/entity-references (mcp tool: list_entity_references)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/entity-references","mcp_tool":"list_entity_references","docs_url":"https://possibility.space/docs/api/entity-graph-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"target":{"type":"string","required":false,"description":"Identity XRI (pspace://user|persona|helper/<id>); defaults to the caller"},"limit":{"type":"number","required":false,"description":"Hosts per page (1–100, default 20)"},"offset":{"type":"number","required":false,"description":"Pagination offset (default 0)"}}}},{"id":"resolve_entity_references","name":"Resolve display states for a batch of targets","description":"Resolve display states for a batch of targets","tags":["api","operation","post","entity-graph"],"examples":["Invoke POST /:possibilityId/entity-references/resolve (mcp tool: resolve_entity_references)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/entity-references/resolve","mcp_tool":"resolve_entity_references","docs_url":"https://possibility.space/docs/api/entity-graph-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"targets":{"type":"array","required":true,"description":"Identity XRIs to resolve (1–100); duplicates resolved once, order preserved"}}}},{"id":"admin_list_files","name":"List files in any possibility","description":"List files in any possibility","tags":["api","operation","get","files-admin"],"examples":["Invoke GET /:possibilityId/files (mcp tool: admin_list_files)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/files","mcp_tool":"admin_list_files","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"admin_upload_file","name":"Upload a file to any possibility","description":"Upload a file to any possibility","tags":["api","operation","post","files-admin"],"examples":["Invoke POST /:possibilityId/files (mcp tool: admin_upload_file)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/files","mcp_tool":"admin_upload_file","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"admin_download_file","name":"Download a file from any possibility","description":"Download a file from any possibility","tags":["api","operation","get","files-admin"],"examples":["Invoke GET /:possibilityId/files/:fileKey (mcp tool: admin_download_file)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/files/:fileKey","mcp_tool":"admin_download_file","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"fileKey":{"type":"string","required":true,"description":"File key"}}}},{"id":"admin_delete_file","name":"Delete a file from any possibility","description":"Delete a file from any possibility","tags":["api","operation","delete","files-admin"],"examples":["Invoke DELETE /:possibilityId/files/:fileKey (mcp tool: admin_delete_file)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/files/:fileKey","mcp_tool":"admin_delete_file","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"fileKey":{"type":"string","required":true,"description":"File key"}}}},{"id":"admin_get_file_metadata","name":"Get file metadata from any possibility","description":"Get file metadata from any possibility","tags":["api","operation","get","files-admin"],"examples":["Invoke GET /:possibilityId/files/:fileKey/meta (mcp tool: admin_get_file_metadata)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/files/:fileKey/meta","mcp_tool":"admin_get_file_metadata","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"fileKey":{"type":"string","required":true,"description":"File key"}}}},{"id":"list_files","name":"List files","description":"List files","tags":["api","operation","get","files"],"examples":["Invoke GET /:possibilityId/files (mcp tool: list_files)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/files","mcp_tool":"list_files","docs_url":"https://possibility.space/docs/api/files-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"upload_file","name":"Upload a file","description":"Upload a file","tags":["api","operation","post","files"],"examples":["Invoke POST /:possibilityId/files (mcp tool: upload_file)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/files","mcp_tool":"upload_file","docs_url":"https://possibility.space/docs/api/files-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"file":{"type":"string","required":true,"description":"File to upload (multipart form data, max 50 MB)"},"key":{"type":"string","required":false,"description":"Custom file key (defaults to sanitized original filename)"}}}},{"id":"download_file","name":"Download a file","description":"Download a file","tags":["api","operation","get","files"],"examples":["Invoke GET /:possibilityId/files/:fileKey (mcp tool: download_file)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/files/:fileKey","mcp_tool":"download_file","docs_url":"https://possibility.space/docs/api/files-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"fileKey":{"type":"string","required":true,"description":"File key (sanitized filename)"}}}},{"id":"delete_file","name":"Delete a file","description":"Delete a file","tags":["api","operation","delete","files"],"examples":["Invoke DELETE /:possibilityId/files/:fileKey (mcp tool: delete_file)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/files/:fileKey","mcp_tool":"delete_file","docs_url":"https://possibility.space/docs/api/files-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"fileKey":{"type":"string","required":true,"description":"File key of the file to delete"}}}},{"id":"get_file_metadata","name":"Get file metadata","description":"Get file metadata","tags":["api","operation","get","files"],"examples":["Invoke GET /:possibilityId/files/:fileKey/meta (mcp tool: get_file_metadata)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/files/:fileKey/meta","mcp_tool":"get_file_metadata","docs_url":"https://possibility.space/docs/api/files-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"fileKey":{"type":"string","required":true,"description":"File key to inspect"}}}},{"id":"presign_file_url","name":"Issue a presigned URL","description":"Issue a presigned URL","tags":["api","operation","post","files"],"examples":["Invoke POST /:possibilityId/files/:fileKey/presign (mcp tool: presign_file_url)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/files/:fileKey/presign","mcp_tool":"presign_file_url","docs_url":"https://possibility.space/docs/api/files-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"fileKey":{"type":"string","required":true,"description":"File key (sanitized filename)"},"op":{"type":"string","required":true,"description":"Operation: 'put' (upload) or 'get' (download)"},"expires_in":{"type":"integer","required":false,"description":"URL expiry in seconds (default 3600, range 60-86400)"}}}},{"id":"list_review_runs","name":"List review runs","description":"List review runs","tags":["api","operation","get","forge-review"],"examples":["Invoke GET /admin/review-runs (mcp tool: list_review_runs)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/review-runs","mcp_tool":"list_review_runs","properties":{"repository_owner":{"type":"string","required":false,"description":"Forge owner of the reviewed repository"},"repository_name":{"type":"string","required":false,"description":"Name of the reviewed repository"},"pull_request":{"type":"integer","required":false,"description":"Pull request number"},"state":{"type":"string","required":false,"description":"Run state","enum":["preparing","waiting","publishing","terminal"]},"limit":{"type":"integer","required":false,"description":"Page size (1–100, default 20)"},"cursor":{"type":"string","required":false,"description":"`next_cursor` from the previous page (a run id)"}},"valid_values":{"state":["preparing","waiting","publishing","terminal"]}}},{"id":"get_review_run","name":"Get a review run and its record","description":"Get a review run and its record","tags":["api","operation","get","forge-review"],"examples":["Invoke GET /admin/review-runs/{runId} (mcp tool: get_review_run)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/review-runs/{runId}","mcp_tool":"get_review_run","properties":{"runId":{"type":"string","required":true,"description":"Run ULID"}}}},{"id":"list_repository_bindings","name":"List repository bindings","description":"Every binding of the capability on the Possibility, newest first, filterable by state and repository. Each item carries the binding id, forge repository id, owner/name, the hook id once activated, secret_ref (a path), state, allowed_actions, lane_run_id and failure_reason. Never a secret.","tags":["api","operation","get","forge-review"],"examples":["Invoke GET /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings (mcp tool: list_repository_bindings)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings","mcp_tool":"list_repository_bindings","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"state":{"type":"string","required":false,"description":"Binding state","enum":["pending","active","rotating","unbinding","unbound","failed"]},"repository_owner":{"type":"string","required":false,"description":"Forge owner of the bound repository"},"repository_name":{"type":"string","required":false,"description":"Name of the bound repository"},"limit":{"type":"integer","required":false,"description":"Page size (1–200, default 50)"}},"valid_values":{"state":["pending","active","rotating","unbinding","unbound","failed"]}}},{"id":"bind_repository","name":"Bind a repository (the lane's step A)","description":"Resolve `owner/name` with the platform's own forge actor (a repository it cannot read cannot be reviewed → 422 `repository_unreadable`, nothing written), mint the per-hook secret into the capability's vault leaf, and insert the binding `pending`. Returns the binding with `hook_url` and `secret_ref` for the lane's runner half. Idempotent on an `active` binding (200 `unchanged`); any other open binding for the repository is a 409 naming it and its exits.","tags":["api","operation","post","forge-review"],"examples":["Invoke POST /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings (mcp tool: bind_repository)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings","mcp_tool":"bind_repository","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"owner":{"type":"string","required":true,"description":"Forge owner (user or organization) of the repository"},"name":{"type":"string","required":true,"description":"Repository name"},"lane_run_id":{"type":"string","required":false,"description":"The dispatch lane's run number, recorded on the binding as the evidence pointer"}}}},{"id":"get_repository_binding","name":"Get a repository binding","description":"Get a repository binding","tags":["api","operation","get","forge-review"],"examples":["Invoke GET /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId} (mcp tool: get_repository_binding)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}","mcp_tool":"get_repository_binding","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"bindingId":{"type":"string","required":true,"description":"Binding ULID"}}}},{"id":"activate_repository_binding","name":"Activate a repository binding","description":"Activate a repository binding","tags":["api","operation","post","forge-review"],"examples":["Invoke POST /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/activate (mcp tool: activate_repository_binding)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/activate","mcp_tool":"activate_repository_binding","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"bindingId":{"type":"string","required":true,"description":"Binding ULID"},"forge_hook_id":{"type":"integer","required":true,"description":"The hook id the forge returned on create and the lane read back"},"lane_run_id":{"type":"string","required":false,"description":"The dispatch lane's run number"}}}},{"id":"unbind_repository","name":"Unbind a repository","description":"Unbind a repository","tags":["api","operation","post","forge-review"],"examples":["Invoke POST /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/unbind (mcp tool: unbind_repository)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/unbind","mcp_tool":"unbind_repository","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"bindingId":{"type":"string","required":true,"description":"Binding ULID"},"lane_run_id":{"type":"string","required":false,"description":"The dispatch lane's run number"}}}},{"id":"close_repository_binding","name":"Close a repository binding","description":"Close a repository binding","tags":["api","operation","post","forge-review"],"examples":["Invoke POST /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/close (mcp tool: close_repository_binding)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/close","mcp_tool":"close_repository_binding","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"bindingId":{"type":"string","required":true,"description":"Binding ULID"},"lane_run_id":{"type":"string","required":false,"description":"The dispatch lane's run number"}}}},{"id":"rotate_repository_binding","name":"Rotate a repository binding's secret","description":"Rotate a repository binding's secret","tags":["api","operation","post","forge-review"],"examples":["Invoke POST /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/rotate (mcp tool: rotate_repository_binding)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/rotate","mcp_tool":"rotate_repository_binding","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"bindingId":{"type":"string","required":true,"description":"Binding ULID"},"lane_run_id":{"type":"string","required":false,"description":"The dispatch lane's run number"}}}},{"id":"fail_repository_binding","name":"Fail a repository binding","description":"Fail a repository binding","tags":["api","operation","post","forge-review"],"examples":["Invoke POST /admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/fail (mcp tool: fail_repository_binding)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/possibilities/{possibilityId}/capabilities/{capabilitySlug}/repository-bindings/{bindingId}/fail","mcp_tool":"fail_repository_binding","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"capabilitySlug":{"type":"string","required":true,"description":"Slug of an installed capability (merge-reviewer)"},"bindingId":{"type":"string","required":true,"description":"Binding ULID"},"reason":{"type":"string","required":true,"description":"Failure class, e.g. hook_create_rejected"},"lane_run_id":{"type":"string","required":false,"description":"The dispatch lane's run number"}}}},{"id":"get_entity_graph","name":"Get entity graph by slug alias","description":"Get entity graph by slug alias","tags":["api","operation","get","graph"],"examples":["Invoke GET /api/graph/:type/by-slug/:slug (mcp tool: get_entity_graph)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/graph/:type/by-slug/:slug","mcp_tool":"get_entity_graph","docs_url":"https://possibility.space/docs/api/graph-api","properties":{"type":{"type":"string","required":true,"description":"Entity type (e.g., playbook, spec, user)"},"slug":{"type":"string","required":true,"description":"Entity slug"},"depth":{"type":"integer","required":false,"description":"Expansion depth for cross-container traversal (L2). Default: 1, max: 3"},"predicates":{"type":"string","required":false,"description":"Comma-separated predicate filter (e.g., enables,depends_on)"},"types":{"type":"string","required":false,"description":"Comma-separated node type filter (e.g., principle,pattern)"},"domains":{"type":"string","required":false,"description":"Comma-separated domain filter (e.g., engineering,design)"},"format":{"type":"string","required":false,"description":"Response format","enum":["json","kno","dot"]}},"valid_values":{"format":["json","kno","dot"]}}},{"id":"get_entity_graph_by_id","name":"Get entity graph by canonical ID","description":"Get entity graph by canonical ID","tags":["api","operation","get","graph"],"examples":["Invoke GET /api/graph/:type/:id (mcp tool: get_entity_graph_by_id)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/graph/:type/:id","mcp_tool":"get_entity_graph_by_id","docs_url":"https://possibility.space/docs/api/graph-api","properties":{"type":{"type":"string","required":true,"description":"Entity type (e.g., playbook, spec, user)"},"id":{"type":"string","required":true,"description":"Canonical entity ULID"},"depth":{"type":"integer","required":false,"description":"Expansion depth for cross-container traversal (L2). Default: 1, max: 3"},"predicates":{"type":"string","required":false,"description":"Comma-separated predicate filter (e.g., enables,depends_on)"},"types":{"type":"string","required":false,"description":"Comma-separated node type filter (e.g., principle,pattern)"},"domains":{"type":"string","required":false,"description":"Comma-separated domain filter (e.g., engineering,design)"},"format":{"type":"string","required":false,"description":"Response format","enum":["json","kno","dot"]}},"valid_values":{"format":["json","kno","dot"]}}},{"id":"query_graph","name":"Execute graph query","description":"Execute graph query","tags":["api","operation","post","graph"],"examples":["Invoke POST /api/graph/query (mcp tool: query_graph)"],"x-pspace-parameters-schema":{"method":"POST","path":"/api/graph/query","mcp_tool":"query_graph","docs_url":"https://possibility.space/docs/api/graph-api","properties":{"scope":{"type":"object","required":true},"predicate_filter":{"type":"object","required":false},"layout":{"type":"object","required":false}}}},{"id":"guides_list_rest","name":"List guides","description":"List every public guide in the Possibility guides catalog. Returns slug, title, domain (auth, email, storage, capabilities, fundamentals, best-practices), guide_type, summary, and the canonical public URL. Optionally filter by domain or guide_type.","tags":["api","operation","get","guides"],"examples":["Invoke GET /v1/guides (mcp tool: guides_list_rest)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/guides","mcp_tool":"guides_list_rest","docs_url":"https://possibility.space/docs/api/guides-api","properties":{"domain":{"type":"string","required":false,"description":"Filter by domain","enum":["auth","email","storage","capabilities","fundamentals","best-practices"]},"guide_type":{"type":"string","required":false,"description":"Filter by guide_type","enum":["how-to","tutorial","runbook","quickstart","reference","pattern","checklist","fundamental","overview","best-practice","vendor-integration","vendor-comparison"]}},"valid_values":{"domain":["auth","email","storage","capabilities","fundamentals","best-practices"],"guide_type":["how-to","tutorial","runbook","quickstart","reference","pattern","checklist","fundamental","overview","best-practice","vendor-integration","vendor-comparison"]}}},{"id":"guides_search_rest","name":"Search guides","description":"Search the public guides catalog by substring match against slug, title, summary, and domain (case-insensitive). Optional domain or guide_type filters narrow results further. Returns the same shape as /v1/guides, ordered by relevance.","tags":["api","operation","get","guides"],"examples":["Invoke GET /v1/guides/search (mcp tool: guides_search_rest)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/guides/search","mcp_tool":"guides_search_rest","docs_url":"https://possibility.space/docs/api/guides-api","properties":{"q":{"type":"string","required":true,"description":"Search query (substring match against slug, title, summary, domain)"},"domain":{"type":"string","required":false,"description":"Optional domain filter applied after the search","enum":["auth","email","storage","capabilities","fundamentals","best-practices"]},"guide_type":{"type":"string","required":false,"description":"Optional guide_type filter applied after the search"},"limit":{"type":"integer","required":false,"description":"Maximum number of results (default 25, max 50)"}},"valid_values":{"domain":["auth","email","storage","capabilities","fundamentals","best-practices"]}}},{"id":"guides_get_by_slug_rest","name":"Get guide by slug","description":"Fetch the full .kno source of a single guide by slug. Returns the parsed YAML as JSON — bytewise-identical to the canonical content/guides/{slug}.kno file. Use /v1/guides first to discover valid slugs.","tags":["api","operation","get","guides"],"examples":["Invoke GET /v1/guides/:slug (mcp tool: guides_get_by_slug_rest)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/guides/:slug","mcp_tool":"guides_get_by_slug_rest","docs_url":"https://possibility.space/docs/api/guides-api","properties":{"slug":{"type":"string","required":true,"description":"Guide slug (e.g., 'getting-started-with-auth')"},"raw":{"type":"boolean","required":false,"description":"If true, return only the parsed .kno source (no envelope)"}}}},{"id":"hive_get_health","name":"Check hive health","description":"Check hive health","tags":["api","operation","get","hive"],"examples":["Invoke GET /health (mcp tool: hive_get_health)"],"x-pspace-parameters-schema":{"method":"GET","path":"/health","mcp_tool":"hive_get_health","properties":{}}},{"id":"hive_list_duplicates","name":"List duplicate entities","description":"List duplicate entities","tags":["api","operation","get","hive"],"examples":["Invoke GET /duplicates (mcp tool: hive_list_duplicates)"],"x-pspace-parameters-schema":{"method":"GET","path":"/duplicates","mcp_tool":"hive_list_duplicates","properties":{}}},{"id":"hive_merge_duplicates","name":"Merge duplicate entities","description":"Merge duplicate entities","tags":["api","operation","post","hive"],"examples":["Invoke POST /duplicates/merge (mcp tool: hive_merge_duplicates)"],"x-pspace-parameters-schema":{"method":"POST","path":"/duplicates/merge","mcp_tool":"hive_merge_duplicates","properties":{}}},{"id":"hive_ignore_duplicate","name":"Ignore a duplicate pair","description":"Ignore a duplicate pair","tags":["api","operation","post","hive"],"examples":["Invoke POST /duplicates/ignore (mcp tool: hive_ignore_duplicate)"],"x-pspace-parameters-schema":{"method":"POST","path":"/duplicates/ignore","mcp_tool":"hive_ignore_duplicate","properties":{}}},{"id":"hive_list_ignored_duplicates","name":"List ignored duplicate pairs","description":"List ignored duplicate pairs","tags":["api","operation","get","hive"],"examples":["Invoke GET /duplicates/ignored (mcp tool: hive_list_ignored_duplicates)"],"x-pspace-parameters-schema":{"method":"GET","path":"/duplicates/ignored","mcp_tool":"hive_list_ignored_duplicates","properties":{}}},{"id":"hive_list_entities","name":"List hive entities","description":"List hive entities","tags":["api","operation","get","hive"],"examples":["Invoke GET / (mcp tool: hive_list_entities)"],"x-pspace-parameters-schema":{"method":"GET","path":"/","mcp_tool":"hive_list_entities","properties":{}}},{"id":"hive_create_entity","name":"Create a hive entity","description":"Create a hive entity","tags":["api","operation","post","hive"],"examples":["Invoke POST / (mcp tool: hive_create_entity)"],"x-pspace-parameters-schema":{"method":"POST","path":"/","mcp_tool":"hive_create_entity","properties":{}}},{"id":"hive_list_stale_entities","name":"List stale entities","description":"List stale entities","tags":["api","operation","get","hive"],"examples":["Invoke GET /stale (mcp tool: hive_list_stale_entities)"],"x-pspace-parameters-schema":{"method":"GET","path":"/stale","mcp_tool":"hive_list_stale_entities","properties":{}}},{"id":"hive_start_retransform","name":"Start retransformation","description":"Start retransformation","tags":["api","operation","post","hive"],"examples":["Invoke POST /retransform (mcp tool: hive_start_retransform)"],"x-pspace-parameters-schema":{"method":"POST","path":"/retransform","mcp_tool":"hive_start_retransform","properties":{}}},{"id":"hive_cancel_retransform","name":"Cancel retransformation","description":"Cancel retransformation","tags":["api","operation","delete","hive"],"examples":["Invoke DELETE /retransform (mcp tool: hive_cancel_retransform)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/retransform","mcp_tool":"hive_cancel_retransform","properties":{}}},{"id":"hive_get_retransform_status","name":"Get retransformation status","description":"Get retransformation status","tags":["api","operation","get","hive"],"examples":["Invoke GET /retransform/status (mcp tool: hive_get_retransform_status)"],"x-pspace-parameters-schema":{"method":"GET","path":"/retransform/status","mcp_tool":"hive_get_retransform_status","properties":{}}},{"id":"hive_get_entity","name":"Get entity by ID","description":"Get entity by ID","tags":["api","operation","get","hive"],"examples":["Invoke GET /{id} (mcp tool: hive_get_entity)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{id}","mcp_tool":"hive_get_entity","properties":{"id":{"type":"string","required":true,"description":"Entity ID"}}}},{"id":"hive_update_entity","name":"Update an entity","description":"Update an entity","tags":["api","operation","patch","hive"],"examples":["Invoke PATCH /{id} (mcp tool: hive_update_entity)"],"x-pspace-parameters-schema":{"method":"PATCH","path":"/{id}","mcp_tool":"hive_update_entity","properties":{"id":{"type":"string","required":true,"description":"Entity ID"}}}},{"id":"hive_delete_entity","name":"Delete an entity","description":"Delete an entity","tags":["api","operation","delete","hive"],"examples":["Invoke DELETE /{id} (mcp tool: hive_delete_entity)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/{id}","mcp_tool":"hive_delete_entity","properties":{"id":{"type":"string","required":true,"description":"Entity ID"}}}},{"id":"hive_resolve_entity","name":"Resolve entity by slug alias","description":"Resolve entity by slug alias","tags":["api","operation","get","hive"],"examples":["Invoke GET /by-slug/{type}/{slug} (mcp tool: hive_resolve_entity)"],"x-pspace-parameters-schema":{"method":"GET","path":"/by-slug/{type}/{slug}","mcp_tool":"hive_resolve_entity","properties":{"type":{"type":"string","required":true,"description":"Entity type"},"slug":{"type":"string","required":true,"description":"Entity slug alias"}}}},{"id":"hive_verify_entity","name":"Verify entity integrity","description":"Verify entity integrity","tags":["api","operation","post","hive"],"examples":["Invoke POST /{id}/verify (mcp tool: hive_verify_entity)"],"x-pspace-parameters-schema":{"method":"POST","path":"/{id}/verify","mcp_tool":"hive_verify_entity","properties":{"id":{"type":"string","required":true,"description":"Entity ID"}}}},{"id":"hive_list_versions","name":"List entity versions","description":"List entity versions","tags":["api","operation","get","hive"],"examples":["Invoke GET /{id}/versions (mcp tool: hive_list_versions)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{id}/versions","mcp_tool":"hive_list_versions","properties":{"id":{"type":"string","required":true,"description":"Entity ID"}}}},{"id":"hive_get_entity_version","name":"Get specific entity version","description":"Get specific entity version","tags":["api","operation","get","hive"],"examples":["Invoke GET /{id}/versions/{ref} (mcp tool: hive_get_entity_version)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{id}/versions/{ref}","mcp_tool":"hive_get_entity_version","properties":{"id":{"type":"string","required":true,"description":"Entity ID"},"ref":{"type":"string","required":true,"description":"Version reference (hash or number)"}}}},{"id":"hive_diff_entity_versions","name":"Diff entity versions","description":"Diff entity versions","tags":["api","operation","get","hive"],"examples":["Invoke GET /{id}/diff (mcp tool: hive_diff_entity_versions)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{id}/diff","mcp_tool":"hive_diff_entity_versions","properties":{"id":{"type":"string","required":true,"description":"Entity ID"}}}},{"id":"hive_get_entity_at_time","name":"Get entity at specific time","description":"Get entity at specific time","tags":["api","operation","get","hive"],"examples":["Invoke GET /{id}/at (mcp tool: hive_get_entity_at_time)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{id}/at","mcp_tool":"hive_get_entity_at_time","properties":{"id":{"type":"string","required":true,"description":"Entity ID"}}}},{"id":"list_kno_types","name":"List valid KNO types and tiers","description":"List valid KNO types and tiers","tags":["api","operation","get","kno"],"examples":["Invoke GET /kno/types (mcp tool: list_kno_types)"],"x-pspace-parameters-schema":{"method":"GET","path":"/kno/types","mcp_tool":"list_kno_types","docs_url":"https://possibility.space/docs/api/kno-api","properties":{}}},{"id":"validate_kno","name":"Validate KNO file","description":"Validate KNO file","tags":["api","operation","post","kno"],"examples":["Invoke POST /kno/validate (mcp tool: validate_kno)"],"x-pspace-parameters-schema":{"method":"POST","path":"/kno/validate","mcp_tool":"validate_kno","docs_url":"https://possibility.space/docs/api/kno-api","properties":{"content":{"type":"string","required":true,"description":"The .kno file content (YAML as string)"},"mode":{"type":"string","required":false,"description":"Validation mode. `strict` rejects on SHOULD violations as well as MUST; `optimistic` (default) only blocks on MUST; `permissive` reports findings but never blocks.","enum":["strict","optimistic","permissive"]}},"valid_values":{"mode":["strict","optimistic","permissive"]}}},{"id":"validate_kaml","name":"Validate KAML microsyntax","description":"Validate KAML microsyntax","tags":["api","operation","post","kno"],"examples":["Invoke POST /kno/validate/kaml (mcp tool: validate_kaml)"],"x-pspace-parameters-schema":{"method":"POST","path":"/kno/validate/kaml","mcp_tool":"validate_kaml","docs_url":"https://possibility.space/docs/api/kno-api","properties":{}}},{"id":"render_kno_entity","name":"Render domain type to .kno YAML","description":"Render domain type to .kno YAML","tags":["api","operation","post","kno"],"examples":["Invoke POST /kno/render/entity (mcp tool: render_kno_entity)"],"x-pspace-parameters-schema":{"method":"POST","path":"/kno/render/entity","mcp_tool":"render_kno_entity","docs_url":"https://possibility.space/docs/api/kno-api","properties":{"type":{"type":"string","required":true,"description":"Entity type: 'diagram' or 'document'"},"source":{"type":"string","required":true,"description":"Original source content"},"title":{"type":"string","required":true,"description":"Entity title"},"id":{"type":"string","required":false,"description":"Entity ID (auto-generated if omitted)"},"version":{"type":"string","required":false,"description":"Entity version (default: 0.1.0)"},"author":{"type":"string","required":false,"description":"Author name"},"format":{"type":"string","required":false,"description":"Source format for diagrams: mermaid, d2, ascii, plantuml, graphviz"},"diagramType":{"type":"string","required":false,"description":"Diagram classification: architecture, flowchart, sequence, etc."},"documentFormat":{"type":"string","required":false,"description":"Source format for documents: markdown, asciidoc, rst, html, plain"},"purpose":{"type":"string","required":false,"description":"Document purpose: reference, guide, tutorial, specification, etc."},"elements":{"type":"object","required":false,"description":"Pre-parsed DiagramElements (optional for diagrams)"},"structure":{"type":"object","required":false,"description":"Pre-parsed DocumentStructure (optional for documents)"}}}},{"id":"convert_to_kno","name":"Auto-detect and convert to .kno","description":"Auto-detect and convert to .kno","tags":["api","operation","post","kno"],"examples":["Invoke POST /kno/convert (mcp tool: convert_to_kno)"],"x-pspace-parameters-schema":{"method":"POST","path":"/kno/convert","mcp_tool":"convert_to_kno","docs_url":"https://possibility.space/docs/api/kno-api","properties":{"source":{"type":"string","required":true,"description":"Source content to convert"},"sourcePath":{"type":"string","required":false,"description":"Original file path (used for format detection via extension)"},"format":{"type":"string","required":false,"description":"Explicit format override (skips auto-detection)"},"title":{"type":"string","required":false,"description":"Entity title"},"id":{"type":"string","required":false,"description":"Entity ID (auto-generated if omitted)"},"author":{"type":"string","required":false,"description":"Author name"}}}},{"id":"list_kno_objects","name":"List KNO objects","description":"List KNO objects","tags":["api","operation","get","kno"],"examples":["Invoke GET /kno (mcp tool: list_kno_objects)"],"x-pspace-parameters-schema":{"method":"GET","path":"/kno","mcp_tool":"list_kno_objects","docs_url":"https://possibility.space/docs/api/kno-api","properties":{"type":{"type":"string","required":false,"description":"Filter by entity type"},"limit":{"type":"integer","required":false,"description":"Maximum results (default: 100)"}}}},{"id":"get_kno_object","name":"Get KNO object by ID","description":"Get KNO object by ID","tags":["api","operation","get","kno"],"examples":["Invoke GET /kno/{id} (mcp tool: get_kno_object)"],"x-pspace-parameters-schema":{"method":"GET","path":"/kno/{id}","mcp_tool":"get_kno_object","docs_url":"https://possibility.space/docs/api/kno-api","properties":{"id":{"type":"string","required":true,"description":"KNO object ID (e.g., 'user', 'organization')"}}}},{"id":"submit_observation","name":"Submit observation","description":"Submit observation","tags":["api","operation","post","learning"],"examples":["Invoke POST /api/learn/observations (mcp tool: submit_observation)"],"x-pspace-parameters-schema":{"method":"POST","path":"/api/learn/observations","mcp_tool":"submit_observation","properties":{"type":{"type":"string","required":true,"description":"Type of observation","enum":["query_pattern","gap_discovery","feedback","usage_signal"]},"context":{"type":"object","required":true,"description":"Context of the observation (freeform)"},"signal":{"type":"object","required":true,"description":"The observation signal data (freeform)"},"entity_types":{"type":"array","required":false,"description":"Entity types referenced by this observation"},"predicates":{"type":"array","required":false,"description":"Predicates referenced by this observation"},"source":{"type":"string","required":false,"description":"Source system that generated this observation"}},"valid_values":{"type":["query_pattern","gap_discovery","feedback","usage_signal"]}}},{"id":"list_observations","name":"List observations (paginated)","description":"List observations (paginated)","tags":["api","operation","get","learning"],"examples":["Invoke GET /api/learn/observations (mcp tool: list_observations)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/learn/observations","mcp_tool":"list_observations","properties":{"type":{"type":"string","required":false,"description":"Filter by observation type","enum":["query_pattern","gap_discovery","feedback","usage_signal"]},"entity_type":{"type":"string","required":false,"description":"Filter by entity type in observation"},"since":{"type":"string","required":false,"description":"ISO 8601 date — only observations after this time"},"limit":{"type":"integer","required":false,"description":"Max results (default: 100)"},"offset":{"type":"integer","required":false,"description":"Pagination offset (default: 0)"}},"valid_values":{"type":["query_pattern","gap_discovery","feedback","usage_signal"]}}},{"id":"count_observations","name":"Count observations by type","description":"Count observations by type","tags":["api","operation","get","learning"],"examples":["Invoke GET /api/learn/observations/count (mcp tool: count_observations)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/learn/observations/count","mcp_tool":"count_observations","properties":{"type":{"type":"string","required":false,"description":"Filter by observation type","enum":["query_pattern","gap_discovery","feedback","usage_signal"]}},"valid_values":{"type":["query_pattern","gap_discovery","feedback","usage_signal"]}}},{"id":"list_patterns","name":"List detected patterns","description":"List detected patterns","tags":["api","operation","get","learning"],"examples":["Invoke GET /admin/learn/patterns (mcp tool: list_patterns)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/learn/patterns","mcp_tool":"list_patterns","properties":{"status":{"type":"string","required":false,"description":"Filter by pattern status","enum":["detected","reviewed","accepted","rejected","evolved"]},"type":{"type":"string","required":false,"description":"Filter by pattern type","enum":["schema_gap","predicate_emergence","type_cluster","chain_gap","density_anomaly"]},"min_confidence":{"type":"number","required":false,"description":"Minimum confidence score (0.0–1.0)"},"limit":{"type":"integer","required":false,"description":"Max results (default: 100)"},"offset":{"type":"integer","required":false,"description":"Pagination offset"}},"valid_values":{"status":["detected","reviewed","accepted","rejected","evolved"],"type":["schema_gap","predicate_emergence","type_cluster","chain_gap","density_anomaly"]}}},{"id":"get_pattern","name":"Get pattern by ID","description":"Get pattern by ID","tags":["api","operation","get","learning"],"examples":["Invoke GET /admin/learn/patterns/:id (mcp tool: get_pattern)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/learn/patterns/:id","mcp_tool":"get_pattern","properties":{"id":{"type":"string","required":true,"description":"Pattern ID"}}}},{"id":"list_proposals","name":"List proposals","description":"List proposals","tags":["api","operation","get","learning"],"examples":["Invoke GET /admin/learn/proposals (mcp tool: list_proposals)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/learn/proposals","mcp_tool":"list_proposals","properties":{"status":{"type":"string","required":false,"description":"Filter by proposal status","enum":["draft","pending_review","approved","rejected","executed"]},"pattern_id":{"type":"string","required":false,"description":"Filter by source pattern ID"},"limit":{"type":"integer","required":false,"description":"Max results (default: 100)"},"offset":{"type":"integer","required":false,"description":"Pagination offset (default: 0)"}},"valid_values":{"status":["draft","pending_review","approved","rejected","executed"]}}},{"id":"get_proposal","name":"Get proposal by ID","description":"Get proposal by ID","tags":["api","operation","get","learning"],"examples":["Invoke GET /admin/learn/proposals/:id (mcp tool: get_proposal)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/learn/proposals/:id","mcp_tool":"get_proposal","properties":{"id":{"type":"string","required":true,"description":"Proposal ID"}}}},{"id":"create_proposal","name":"Create schema evolution proposal","description":"Create schema evolution proposal","tags":["api","operation","post","learning"],"examples":["Invoke POST /admin/learn/propose (mcp tool: create_proposal)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/learn/propose","mcp_tool":"create_proposal","properties":{"patternId":{"type":"string","required":false,"description":"Single pattern ID to generate proposal for"},"patternIds":{"type":"array","required":false,"description":"Multiple pattern IDs for batch proposal generation"}}}},{"id":"leave_note","name":"Leave a note at an address or for a persona","description":"Leave a note at an address or for a persona","tags":["api","operation","post","messaging"],"examples":["Invoke POST /admin/messaging/notes (mcp tool: leave_note)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/messaging/notes","mcp_tool":"leave_note","properties":{"body":{"type":"object","required":true,"description":"Note intake (wire grammar: actor, audience, body, context, frame)."}}}},{"id":"get_note","name":"Get one note, with the id of the thread it belongs to","description":"Get one note, with the id of the thread it belongs to","tags":["api","operation","get","messaging"],"examples":["Invoke GET /admin/messaging/notes/{noteId} (mcp tool: get_note)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/messaging/notes/{noteId}","mcp_tool":"get_note","properties":{"noteId":{"type":"string","required":true},"address":{"type":"string","required":false,"description":"Optional address selected for this operator read."}}}},{"id":"mark_read","name":"Mark a note read for an address (deliberate uptake, not a passive receipt)","description":"Mark a note read for an address (deliberate uptake, not a passive receipt)","tags":["api","operation","post","messaging"],"examples":["Invoke POST /admin/messaging/notes/{noteId}/read (mcp tool: mark_read)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/messaging/notes/{noteId}/read","mcp_tool":"mark_read","properties":{"noteId":{"type":"string","required":true},"body":{"type":"object","required":true}}}},{"id":"add_to","name":"Add a note to another address (attaches the same note; never copies)","description":"Add a note to another address (attaches the same note; never copies)","tags":["api","operation","post","messaging"],"examples":["Invoke POST /admin/messaging/notes/{noteId}/add-to (mcp tool: add_to)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/messaging/notes/{noteId}/add-to","mcp_tool":"add_to","properties":{"noteId":{"type":"string","required":true},"body":{"type":"object","required":true}}}},{"id":"check_inbox","name":"Count unread notes across explicit addresses and/or the caller's log-attested participation addresses (max 32 explicit; presence excluded; derived addresses rank news-first with explicit truncation)","description":"Count unread notes across explicit addresses and/or the caller's log-attested participation addresses (max 32 explicit; presence excluded; derived addresses rank news-first with explicit truncation)","tags":["api","operation","get","messaging"],"examples":["Invoke GET /admin/messaging/inbox/unread-count (mcp tool: check_inbox)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/messaging/inbox/unread-count","mcp_tool":"check_inbox","properties":{"addresses":{"type":"string","required":false,"description":"Comma-separated explicit watch-list addresses. Optional: omitted means participation-only (the zero-config inbox)."},"participation":{"type":"boolean","required":false,"description":"Union in the caller's log-attested participation addresses (addresses their accepted notes reach). Defaults to true when addresses is omitted, false when a watch-list is supplied — explicit-watch-list semantics are preserved exactly."}}}},{"id":"catch_up","name":"Catch up on an address: the ordered projection since a checkpoint","description":"Catch up on an address: the ordered projection since a checkpoint","tags":["api","operation","get","messaging"],"examples":["Invoke GET /admin/messaging/addresses/{address}/notes (mcp tool: catch_up)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/messaging/addresses/{address}/notes","mcp_tool":"catch_up","properties":{"address":{"type":"string","required":true},"since":{"type":"integer","required":false,"description":"Inclusive log-position lower bound: entries at position >= since are returned. Checkpoint consumers resume with last-processed position + 1, or use filter=unread with read-as-uptake for repeat-tolerant consumption."},"filter":{"type":"string","required":false,"enum":["all","unread","thread-resolutions"]}},"valid_values":{"filter":["all","unread","thread-resolutions"]}}},{"id":"trace_thread","name":"Trace a thread's hop graph","description":"Trace a thread's hop graph","tags":["api","operation","get","messaging"],"examples":["Invoke GET /admin/messaging/threads/{threadId} (mcp tool: trace_thread)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/messaging/threads/{threadId}","mcp_tool":"trace_thread","properties":{"threadId":{"type":"string","required":true},"address":{"type":"string","required":false}}}},{"id":"notices_list","name":"List notices","description":"List active public notices. Each notice describes a platform constraint, possibility-scoped advisory, deprecation, outage, or contract-affecting condition. Optionally filter by endpoint XRI, by possibility id, or by both. When `possibility_id` is present without `applies_to`, the response includes global platform notices plus notices whose `applies_to` includes `pspace://possibility/{id}`.","tags":["api","operation","get","notices"],"examples":["Invoke GET /v1/notices (mcp tool: notices_list)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/notices","mcp_tool":"notices_list","docs_url":"https://possibility.space/docs/api/notices-api","properties":{"applies_to":{"type":"string","required":false,"description":"Filter to notices whose `applies_to` array includes this XRI (e.g., `pspace://api-endpoint/oauth-authorize`)."},"possibility_id":{"type":"string","required":false,"description":"Filter to global platform notices plus public notices scoped to `pspace://possibility/{possibility_id}`. When combined with `applies_to`, endpoint notices scoped to a different possibility are excluded."}}}},{"id":"notices_get","name":"Get notice by slug","description":"Get a single platform notice by its slug. Returns the full notice entity including KAML body, severity, status, applies_to targets, and remediation_url. Only active+public notices are addressable.","tags":["api","operation","get","notices"],"examples":["Invoke GET /v1/notices/:slug (mcp tool: notices_get)"],"x-pspace-parameters-schema":{"method":"GET","path":"/v1/notices/:slug","mcp_tool":"notices_get","docs_url":"https://possibility.space/docs/api/notices-api","properties":{"slug":{"type":"string","required":true,"description":"Notice slug (e.g., `2026-04-25-custom-auth-domain-required`)"}}}},{"id":"list_entity_types","name":"Get all entity types with hierarchy","description":"Get all entity types with hierarchy","tags":["api","operation","get","ontology"],"examples":["Invoke GET /api/ontology/types (mcp tool: list_entity_types)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/ontology/types","mcp_tool":"list_entity_types","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{}}},{"id":"get_schema_graph","name":"Get schema-level graph","description":"Get schema-level graph","tags":["api","operation","get","ontology"],"examples":["Invoke GET /api/ontology/schema-graph (mcp tool: get_schema_graph)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/ontology/schema-graph","mcp_tool":"get_schema_graph","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{}}},{"id":"get_ontological_chain","name":"Get ontological chain","description":"Get ontological chain","tags":["api","operation","get","ontology"],"examples":["Invoke GET /api/ontology/chain/:type (mcp tool: get_ontological_chain)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/ontology/chain/:type","mcp_tool":"get_ontological_chain","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{"type":{"type":"string","required":true,"description":"Entity type slug (e.g., playbook, user, spec)"}}}},{"id":"list_predicates","name":"Get all predicates with semantics","description":"Get all predicates with semantics","tags":["api","operation","get","ontology"],"examples":["Invoke GET /api/ontology/predicates (mcp tool: list_predicates)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/ontology/predicates","mcp_tool":"list_predicates","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{}}},{"id":"compute_semantic_distance","name":"Compute distance between entities","description":"Compute distance between entities","tags":["api","operation","post","ontology"],"examples":["Invoke POST /api/ontology/distance (mcp tool: compute_semantic_distance)"],"x-pspace-parameters-schema":{"method":"POST","path":"/api/ontology/distance","mcp_tool":"compute_semantic_distance","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{"from":{"type":"string","required":true,"description":"Source entity XRI (e.g., pspace://playbook:engineering-playbook)"},"to":{"type":"string","required":true,"description":"Target entity XRI (e.g., pspace://spec:kno-spec)"},"distance_types":{"type":"array","required":false,"description":"Which distance types to compute (defaults to all 3)"}}}},{"id":"anticipate_entities","name":"Anticipate likely entities","description":"Anticipate likely entities","tags":["api","operation","post","ontology"],"examples":["Invoke POST /api/ontology/anticipate (mcp tool: anticipate_entities)"],"x-pspace-parameters-schema":{"method":"POST","path":"/api/ontology/anticipate","mcp_tool":"anticipate_entities","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{"context_xri":{"type":"string","required":false,"description":"Context entity XRI for anticipation"},"traversal_direction":{"type":"string","required":false,"description":"Relationship direction to traverse"},"query_context":{"type":"string","required":false,"description":"Free-text description of intent"},"limit":{"type":"integer","required":false,"description":"Max candidates to return (default: 10)"}}}},{"id":"materialize_entity","name":"Materialize provisional entity","description":"Materialize provisional entity","tags":["api","operation","post","ontology"],"examples":["Invoke POST /api/ontology/materialize (mcp tool: materialize_entity)"],"x-pspace-parameters-schema":{"method":"POST","path":"/api/ontology/materialize","mcp_tool":"materialize_entity","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{"entity_type":{"type":"string","required":true,"description":"Entity type to create (must be a valid kno type)"},"seed_content":{"type":"object","required":false,"description":"Initial content fields for the entity"},"trigger_xri":{"type":"string","required":false,"description":"XRI of the entity that triggered materialization"},"confidence":{"type":"number","required":false,"description":"Confidence score (0.0–1.0, default: 0.5)"},"reasons":{"type":"array","required":false,"description":"Candidate reasons (dangling_xri, schema_inference, observation_signal)"}}}},{"id":"enrich_entity","name":"Add enrichment data","description":"Add enrichment data","tags":["api","operation","put","ontology"],"examples":["Invoke PUT /api/ontology/materialize/:id/enrich (mcp tool: enrich_entity)"],"x-pspace-parameters-schema":{"method":"PUT","path":"/api/ontology/materialize/:id/enrich","mcp_tool":"enrich_entity","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{"id":{"type":"string","required":true,"description":"Provisional entity ULID"},"enrichments":{"type":"object","required":true,"description":"Key-value enrichment fields to merge into entity content"}}}},{"id":"get_enrichment_suggestions","name":"Get enrichment suggestions","description":"Get enrichment suggestions","tags":["api","operation","get","ontology"],"examples":["Invoke GET /api/ontology/materialize/:id/suggestions (mcp tool: get_enrichment_suggestions)"],"x-pspace-parameters-schema":{"method":"GET","path":"/api/ontology/materialize/:id/suggestions","mcp_tool":"get_enrichment_suggestions","docs_url":"https://possibility.space/docs/api/ontology-api","properties":{"id":{"type":"string","required":true,"description":"Provisional entity ULID"}}}},{"id":"list_possibility_personas","name":"List all personas in a possibility (Q-COL-14 Phase 3.3.2)","description":"Admin view of every persona record in the given possibility.\nPersonas are the canonical \"who acted in this possibility\"\nanchor per Q-COL-15 Hybrid Realm Model and FP §0.7.1\nIdentity Layering. Read-only; returns rows ordered oldest-first.\n","tags":["api","operation","get","possibilities-admin"],"examples":["Invoke GET /{possibilityId}/personas (mcp tool: list_possibility_personas)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{possibilityId}/personas","mcp_tool":"list_possibility_personas","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility canonical ID (pos_*)"}}}},{"id":"possibilities-admin-api_get","name":"Run email domain health diagnostics","description":"Comprehensive diagnostic endpoint that checks every layer of the\nemail delivery pipeline for a possibility's configured sender domain:\n\n  1. SMTP connectivity — TCP connect to relay host\n  2. Relay domain auth — Relay domain authentication status\n  3. SPF — TXT record with platform SPF include chain\n  4. DKIM — Double-hop CNAME chain for s1/s2 selectors\n     (organizer → intermediary → provider)\n  5. DMARC — Policy record and alignment\n  6. Last send — Most recent verification timestamp\n\nReturns overall_status (healthy | degraded | broken) and\nactionable remediation_steps for any failing checks.\n","tags":["api","operation","get","possibilities-admin"],"examples":["Invoke GET /{possibilityId}/email-domain/diagnostics (mcp tool: possibilities-admin-api_get)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{possibilityId}/email-domain/diagnostics","mcp_tool":"possibilities-admin-api_get","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"}}}},{"id":"send_test_email","name":"Send a test email through the configured domain","description":"Sends a test email from the possibility's configured email sender\ndomain to verify end-to-end delivery. Runs a lightweight diagnostic\npre-check and includes diagnostic headers (X-Pspace-Test) identifying\nthe message as a test. Defaults to sending to the admin's own email\nif no recipient is specified.\n","tags":["api","operation","post","possibilities-admin"],"examples":["Invoke POST /{possibilityId}/email-domain/test (mcp tool: send_test_email)"],"x-pspace-parameters-schema":{"method":"POST","path":"/{possibilityId}/email-domain/test","mcp_tool":"send_test_email","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"}}}},{"id":"list_possibility_roles","name":"List auth zone roles for a possibility","description":"Returns all roles defined in the possibility's\nauth zone. Requires auth to be provisioned.\n","tags":["api","operation","get","possibilities-admin"],"examples":["Invoke GET /{possibilityId}/roles (mcp tool: list_possibility_roles)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{possibilityId}/roles","mcp_tool":"list_possibility_roles","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"}}}},{"id":"get_user_possibility_roles","name":"List roles assigned to a user","description":"Returns auth zone roles currently assigned to a specific user\nwithin the possibility's auth zone.\n","tags":["api","operation","get","possibilities-admin"],"examples":["Invoke GET /{possibilityId}/roles/{userId} (mcp tool: get_user_possibility_roles)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{possibilityId}/roles/{userId}","mcp_tool":"get_user_possibility_roles","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"userId":{"type":"string","required":true,"description":"Auth provider user ID within the auth zone"}}}},{"id":"assign_possibility_role","name":"Assign a role to a user","description":"Assigns an auth zone role to a user within the possibility.\nThe role must exist in the auth zone. Logs an activity event.\n","tags":["api","operation","post","possibilities-admin"],"examples":["Invoke POST /{possibilityId}/roles/{userId} (mcp tool: assign_possibility_role)"],"x-pspace-parameters-schema":{"method":"POST","path":"/{possibilityId}/roles/{userId}","mcp_tool":"assign_possibility_role","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"userId":{"type":"string","required":true,"description":"Auth provider user ID within the auth zone"},"role":{"type":"string","required":true,"description":"Role name to assign (e.g. 'pspace:admin')"}}}},{"id":"remove_possibility_role","name":"Remove a role from a user","description":"Removes an auth zone role from a user within the possibility.\nThe role must exist in the auth zone. Logs an activity event.\n","tags":["api","operation","delete","possibilities-admin"],"examples":["Invoke DELETE /{possibilityId}/roles/{userId}/{role} (mcp tool: remove_possibility_role)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/{possibilityId}/roles/{userId}/{role}","mcp_tool":"remove_possibility_role","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID"},"userId":{"type":"string","required":true,"description":"Auth provider user ID within the auth zone"},"role":{"type":"string","required":true,"description":"Role name to remove"}}}},{"id":"create_possibility","name":"Create possibility","description":"Create possibility","tags":["api","operation","post","possibilities"],"examples":["Invoke POST / (mcp tool: create_possibility)"],"x-pspace-parameters-schema":{"method":"POST","path":"/","mcp_tool":"create_possibility","properties":{"name":{"type":"string","required":true,"description":"Display name for the possibility (1-200 chars)"},"slug":{"type":"string","required":false,"description":"URL-safe kebab-case slug (2-80 chars). Auto-generated from name if omitted."},"description":{"type":"string","required":false,"description":"Short description (max 2000 chars)"},"tags":{"type":"array","required":false,"description":"Array of freeform tags (max 20 tags, each max 50 chars)"}}}},{"id":"list_my_possibilities","name":"List user's possibilities","description":"List user's possibilities","tags":["api","operation","get","possibilities"],"examples":["Invoke GET / (mcp tool: list_my_possibilities)"],"x-pspace-parameters-schema":{"method":"GET","path":"/","mcp_tool":"list_my_possibilities","properties":{"status":{"type":"string","required":false,"description":"Filter by status: draft, active, paused, archived, deprecated"}}}},{"id":"get_possibility","name":"Get possibility details","description":"Get possibility details","tags":["api","operation","get","possibilities"],"examples":["Invoke GET /:possibilityId (mcp tool: get_possibility)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId","mcp_tool":"get_possibility","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier (canonical) or mutable slug"}}}},{"id":"deprecate_published_capability","name":"Deprecate a published capability","description":"Deprecate a published capability","tags":["api","operation","post","possibilities"],"examples":["Invoke POST /:possibilityId/capabilities/:slug/deprecate (mcp tool: deprecate_published_capability)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/capabilities/:slug/deprecate","mcp_tool":"deprecate_published_capability","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the publishing Possibility (the caller must organize it)"},"slug":{"type":"string","required":true,"description":"Capability slug as listed in the catalog"},"deprecation_notice":{"type":"string","required":false,"description":"CommonMark shown to consumers on the badge (1–2000 chars)"},"end_of_life":{"type":"string","required":false,"description":"YYYY-MM-DD after which no further updates ship. Optional even for\nexternal capabilities (#3882: availability commitments are\ndeferred marketplace terms). A disclosure, never a guarantee.\n"}}}},{"id":"set_possibility_member_role","name":"Assign possibility member role","description":"Assign possibility member role","tags":["api","operation","post","possibilities"],"examples":["Invoke POST /:possibilityId/members/:userId/roles (mcp tool: set_possibility_member_role)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/members/:userId/roles","mcp_tool":"set_possibility_member_role","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"userId":{"type":"string","required":true,"description":"User ULID identifier"},"role":{"type":"string","required":true,"description":"Possibility role: organizer or contributor"},"reason":{"type":"string","required":true,"description":"Audit reason (min 10 chars, max 2000 chars). Required by Phase 5.5\n(#2102) for ROLE_CHANGED / MEMBER_ADDED activity audit trail.\n"}}}},{"id":"remove_possibility_member_role","name":"Remove member role","description":"Remove member role","tags":["api","operation","delete","possibilities"],"examples":["Invoke DELETE /:possibilityId/members/:userId/roles/:roleName (mcp tool: remove_possibility_member_role)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/members/:userId/roles/:roleName","mcp_tool":"remove_possibility_member_role","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"userId":{"type":"string","required":true,"description":"User ULID identifier"},"roleName":{"type":"string","required":true,"description":"Possibility role name"},"reason":{"type":"string","required":true,"description":"Audit reason (min 10 chars, max 2000 chars). Required by Phase 5.5\n(#2102) for MEMBER_REMOVED activity audit trail.\n"}}}},{"id":"transfer_possibility_ownership","name":"Transfer ownership to another member","description":"Transfer ownership to another member","tags":["api","operation","post","possibilities"],"examples":["Invoke POST /:possibilityId/members/:userId/transfer-ownership (mcp tool: transfer_possibility_ownership)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/members/:userId/transfer-ownership","mcp_tool":"transfer_possibility_ownership","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"userId":{"type":"string","required":true,"description":"Incoming organizer's user ULID. Must already be a member."},"reason":{"type":"string","required":true,"description":"Audit reason (min 10 chars, max 2000 chars)"}}}},{"id":"remove_possibility_member","name":"Remove member","description":"Remove member","tags":["api","operation","delete","possibilities"],"examples":["Invoke DELETE /:possibilityId/members/:userId (mcp tool: remove_possibility_member)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/members/:userId","mcp_tool":"remove_possibility_member","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"userId":{"type":"string","required":true,"description":"User ULID identifier"}}}},{"id":"create_possibility_invite","name":"Create possibility invite","description":"Create a Possibility collaboration/onboarding invite and send the\nrecipient onboarding email. This grants a platform collaboration role\nsuch as `contributor` or `organizer`; it is not the default path for\ntenant application user-table imports, app-user metadata, or\nmail-domain isolation tests. Use `POST /:possibilityId/users` for\ntenant application user-table work.\n","tags":["api","operation","post","possibilities"],"examples":["Invoke POST /:possibilityId/invites (mcp tool: create_possibility_invite)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/invites","mcp_tool":"create_possibility_invite","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"email":{"type":"string","required":true,"description":"Invitee email address"},"role":{"type":"string","required":false,"description":"Possibility role to grant on claim"},"note":{"type":"string","required":false,"description":"Optional organizer note (max 500 chars). Surfaces in invite email and acceptance UI in later phases."},"expires_in_hours":{"type":"number","required":false,"description":"Optional TTL override in hours. Default 24h. Values above 720\n(= 30 days) are silently clamped to 720 with an RFC 7234 §5.5\n`Warning: 199 - \"expires_in_hours clamped to 720...\"` response\nheader. Malformed values (negative, NaN, > 100000) → 400.\n"}}}},{"id":"batch_invite_to_possibility","name":"Batch invite","description":"Create up to 50 invites in a single request, all with the same\nrole/note/expires_in_hours. Per-email isolation: a single failed\nrow never rolls back the others. Within-batch duplicates (after\ncase-insensitive normalization) are reported as `skipped` with\nreason `duplicate_in_batch`. Emails that already map to a current\nmember of the Possibility are reported as `rejected` with\n`sub_code: already_member`, `user_id`, and `current_role` (#2752)\n— no invite row, no email; use the role-change route instead.\nAlways returns 200 if the request shape is valid; per-row\noutcomes appear in `results[]`; `summary` counts\ncreated/skipped/rejected/failed.\n\nThis endpoint is for Possibility collaboration/onboarding invites.\nIt must not be used as the universal default for tenant application\nuser imports, app-user metadata, or mail-domain isolation tests; use\n`POST /:possibilityId/users` for tenant application user-table work.\n\nSchema-level rejections (400):\n  - `emails` empty or > 50\n  - any element is not a well-formed email\n  - `role` not in {contributor, organizer}\n  - `note` > 500 chars\n  - `expires_in_hours` negative, NaN, or > 100000\n\nSoft clamp (200 + Warning header):\n  - `expires_in_hours > 720` → clamped to 720, applies to ALL rows\n","tags":["api","operation","post","possibilities"],"examples":["Invoke POST /:possibilityId/invites:batch (mcp tool: batch_invite_to_possibility)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/invites:batch","mcp_tool":"batch_invite_to_possibility","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"emails":{"type":"array","required":true,"description":"Array of invitee email addresses (1-50, deduplicated case-insensitively)"},"role":{"type":"string","required":false,"description":"Possibility role to grant on claim (default contributor)"},"note":{"type":"string","required":false,"description":"Optional organizer note (max 500 chars), applied to every invite in the batch"},"expires_in_hours":{"type":"number","required":false,"description":"Optional TTL override (default 24h, max 720h, see single-invite endpoint for clamp semantics)"}}}},{"id":"revoke_possibility_invite","name":"Revoke invite","description":"Revoke invite","tags":["api","operation","delete","possibilities"],"examples":["Invoke DELETE /:possibilityId/invites/:inviteId (mcp tool: revoke_possibility_invite)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/invites/:inviteId","mcp_tool":"revoke_possibility_invite","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"inviteId":{"type":"string","required":true,"description":"Invite canonical ID"}}}},{"id":"resend_possibility_invite","name":"Resend invite","description":"Resend invite","tags":["api","operation","post","possibilities"],"examples":["Invoke POST /:possibilityId/invites/:inviteId/resend (mcp tool: resend_possibility_invite)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/invites/:inviteId/resend","mcp_tool":"resend_possibility_invite","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"inviteId":{"type":"string","required":true,"description":"Invite canonical ID"}}}},{"id":"complete_possibility_member_invite","name":"Complete a member invite (claim token, set password, verify email)","description":"Complete a member invite (claim token, set password, verify email)","tags":["api","operation","post","possibilities"],"examples":["Invoke POST /:possibilityId/members/:email/complete-invite (mcp tool: complete_possibility_member_invite)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/members/:email/complete-invite","mcp_tool":"complete_possibility_member_invite","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"email":{"type":"string","required":true,"description":"Invitee email address (URL-encoded)"},"invite_token":{"type":"string","required":true,"description":"The single-use invite token from the invitation mail. Consumed\non success; released on any failed completion so the same link\ncan be retried. Never logged.\n"},"password":{"type":"string","required":true,"description":"The invitee's chosen initial password (min 8 chars, max 256).\nThe possibility's auth-zone password policy is authoritative —\na policy rejection answers 422 without burning the token.\nNever logged.\n"}}}},{"id":"get_possibility_setup_status","name":"Get unified setup status","description":"Get unified setup status","tags":["api","operation","get","possibilities"],"examples":["Invoke GET /:possibilityId/setup-status (mcp tool: get_possibility_setup_status)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/setup-status","mcp_tool":"get_possibility_setup_status","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"},"members_limit":{"type":"integer","required":false,"description":"Page size for the `members` section. Optional. Default 100;\nclamped to the inclusive range [0, 100]. `members_limit=0`\nskips the row query entirely so callers can fetch only the\n`total` count.\n"},"members_offset":{"type":"integer","required":false,"description":"Zero-based offset into the active member list for the\n`members` section. Optional. Default 0; negative values\nare clamped to 0.\n"}}}},{"id":"bootstrap_health","name":"Get bootstrap (preflight) readiness","description":"Get bootstrap (preflight) readiness","tags":["api","operation","get","possibilities"],"examples":["Invoke GET /:possibilityId/bootstrap-health (mcp tool: bootstrap_health)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/bootstrap-health","mcp_tool":"bootstrap_health","properties":{"possibilityId":{"type":"string","required":true,"description":"Possibility ULID identifier"}}}},{"id":"get_possibility_integration_guide","name":"Context-aware onboarding guide for a possibility","description":"Assembles a comprehensive integration guide by gathering auth,\ncustom domain, email, and stack-discovery state in parallel.\nReturns next steps with context-aware endpoint URLs, DNS records,\nand platform resource links.\n\nWhen platform-owned tenant generation fails before organizer DNS can\nproceed, the guide surfaces this as degraded progress and includes a\nretry_platform_generation next step instead of implying that the\norganizer is merely waiting on DNS propagation.\n\nSupports content negotiation:\n  - Accept: application/json → structured JSON response\n  - Accept: text/markdown → rendered markdown guide\n  - ?format=markdown → rendered markdown guide, matching\n    x_pspace_integration_guide_markdown discovery URLs\n\nThe organizer route shows /possibilities/:possibilityId/* endpoints.\nThe platform-admin integration-guide mirror shows platform-admin endpoints instead; organizer-facing content does not advertise that route.\n\nResponse format reference: docs/reference/tenant-auth-quickstart.md\n§ \"Integration Guide Response Format\" documents all fields and sections.\n\nNon-organizer callers receive the same not-found response shape as\nan absent route. Non-organizer bootstrap/orientation bundles therefore\nomit this URL instead of advertising an endpoint their token cannot use.\n","tags":["api","operation","get","possibilities"],"examples":["Invoke GET /:possibilityId/integration-guide (mcp tool: get_possibility_integration_guide)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/integration-guide","mcp_tool":"get_possibility_integration_guide","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility whose organizer guide to retrieve"}}}},{"id":"list_public_paths","name":"List public paths","description":"List public paths","tags":["api","operation","get","public-storage"],"examples":["Invoke GET /:possibilityId/public-paths (mcp tool: list_public_paths)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/public-paths","mcp_tool":"list_public_paths","docs_url":"https://possibility.space/docs/api/public-storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"create_public_path","name":"Make a file public at a path","description":"Make a file public at a path","tags":["api","operation","post","public-storage"],"examples":["Invoke POST /:possibilityId/public-paths (mcp tool: create_public_path)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/public-paths","mcp_tool":"create_public_path","docs_url":"https://possibility.space/docs/api/public-storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"file_key":{"type":"string","required":true,"description":"Key of an already-stored file in the possibility's file storage"},"path":{"type":"string","required":true,"description":"Public path (leading slash, no whitespace, no '..', max 1024 chars)"}}}},{"id":"remove_public_path","name":"Remove a public path","description":"Remove a public path","tags":["api","operation","delete","public-storage"],"examples":["Invoke DELETE /:possibilityId/public-paths/:publicPathId (mcp tool: remove_public_path)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/public-paths/:publicPathId","mcp_tool":"remove_public_path","docs_url":"https://possibility.space/docs/api/public-storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"publicPathId":{"type":"string","required":true,"description":"Public-path ID (pub_-prefixed ULID)"}}}},{"id":"set_security_txt","name":"Set security.txt content","description":"Set security.txt content","tags":["api","operation","put","public-storage"],"examples":["Invoke PUT /:possibilityId/security-txt (mcp tool: set_security_txt)"],"x-pspace-parameters-schema":{"method":"PUT","path":"/:possibilityId/security-txt","mcp_tool":"set_security_txt","docs_url":"https://possibility.space/docs/api/public-storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"},"content":{"type":"string","required":true,"description":"security.txt file content (RFC 9116; at least one Contact field; max 8 KiB)"}}}},{"id":"admin_generate_changelog","name":"Generate release notes from a commit range","description":"Generate release notes from a commit range","tags":["api","operation","post","releases-admin"],"examples":["Invoke POST /admin/releases/changelog (mcp tool: admin_generate_changelog)"],"x-pspace-parameters-schema":{"method":"POST","path":"/admin/releases/changelog","mcp_tool":"admin_generate_changelog","properties":{"from":{"type":"string","required":false,"description":"Starting git ref (SHA or tag). If omitted, uses latest release tag."},"to":{"type":"string","required":false,"description":"Ending git ref. Defaults to HEAD."},"format":{"type":"string","required":false,"description":"Output format. Defaults to both.","enum":["friendly","technical","both"]}},"valid_values":{"format":["friendly","technical","both"]}}},{"id":"admin_get_latest_changelog","name":"Get release notes since the latest release tag","description":"Get release notes since the latest release tag","tags":["api","operation","get","releases-admin"],"examples":["Invoke GET /admin/releases/changelog/latest (mcp tool: admin_get_latest_changelog)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/releases/changelog/latest","mcp_tool":"admin_get_latest_changelog","properties":{"format":{"type":"string","required":false,"description":"Output format: friendly (LLM-transformed), technical (raw commit log), or both. Defaults to both.","enum":["friendly","technical","both"]}},"valid_values":{"format":["friendly","technical","both"]}}},{"id":"list_rfcs","name":"List RFCs","description":"Returns all public RFCs (Request for Comments) that define standards for the .kno format, entity resolution, schema typing, and identity. Optionally filter by status (draft, active, historical, superseded).","tags":["api","operation","get","rfcs"],"examples":["Invoke GET /rfcs (mcp tool: list_rfcs)"],"x-pspace-parameters-schema":{"method":"GET","path":"/rfcs","mcp_tool":"list_rfcs","docs_url":"https://possibility.space/docs/api/rfcs-api","properties":{"status":{"type":"string","required":false,"description":"Filter by RFC status","enum":["draft","active","historical","superseded"]}},"valid_values":{"status":["draft","active","historical","superseded"]}}},{"id":"get_rfc","name":"Get RFC by slug","description":"Get RFC by slug","tags":["api","operation","get","rfcs"],"examples":["Invoke GET /rfcs/by-slug/:slug (mcp tool: get_rfc)"],"x-pspace-parameters-schema":{"method":"GET","path":"/rfcs/by-slug/:slug","mcp_tool":"get_rfc","docs_url":"https://possibility.space/docs/api/rfcs-api","properties":{"slug":{"type":"string","required":true,"description":"RFC slug (e.g., rfc-001-kno-format)"},"raw":{"type":"boolean","required":false,"description":"If true, return full .kno entity instead of external projection"}}}},{"id":"schema_changes_get_history","name":"Get full schema version history","description":"Get full schema version history","tags":["api","operation","get","schema-changes"],"examples":["Invoke GET /schema-changes/{schema_name} (mcp tool: schema_changes_get_history)"],"x-pspace-parameters-schema":{"method":"GET","path":"/schema-changes/{schema_name}","mcp_tool":"schema_changes_get_history","docs_url":"https://possibility.space/docs/api/schema-changes-api","properties":{"schema_name":{"type":"string","required":true,"description":"Schema family name, e.g. `kno-platform-capability`."}}}},{"id":"schema_changes_get_range","name":"Get composed migration plan for a version range","description":"Get composed migration plan for a version range","tags":["api","operation","get","schema-changes"],"examples":["Invoke GET /schema-changes/{schema_name}/{from_version}..{to_version} (mcp tool: schema_changes_get_range)"],"x-pspace-parameters-schema":{"method":"GET","path":"/schema-changes/{schema_name}/{from_version}..{to_version}","mcp_tool":"schema_changes_get_range","docs_url":"https://possibility.space/docs/api/schema-changes-api","properties":{"schema_name":{"type":"string","required":true,"description":"Schema family name, e.g. `kno-platform-capability`."},"from_version":{"type":"string","required":true,"description":"Starting version (the body the caller currently has)."},"to_version":{"type":"string","required":true,"description":"Target version (the schema the caller wants to conform to)."}}}},{"id":"admin_list_tenant_secrets","name":"List secret key names (admin)","description":"List secret key names (admin)","tags":["api","operation","get","secrets-admin"],"examples":["Invoke GET /:possibilityId/secrets (mcp tool: admin_list_tenant_secrets)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/secrets","mcp_tool":"admin_list_tenant_secrets","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_upsert_tenant_secret","name":"Create or update a secret (admin — no denylist)","description":"Admins can write to ANY key including system-managed secrets. Use with caution — modifying OIDC_CLIENT_ID or KC_REALM can break the Possibility's auth integration.\n","tags":["api","operation","post","secrets-admin"],"examples":["Invoke POST /:possibilityId/secrets (mcp tool: admin_upsert_tenant_secret)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/secrets","mcp_tool":"admin_upsert_tenant_secret","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"key":{"type":"string","required":true,"description":"required, alphanumeric + underscores + hyphens, 1-255 chars"},"value":{"type":"string","required":true,"description":"required, 1-65536 chars"}}}},{"id":"admin_get_tenant_secret","name":"Get a secret by key (admin)","description":"Get a secret by key (admin)","tags":["api","operation","get","secrets-admin"],"examples":["Invoke GET /:possibilityId/secrets/:key (mcp tool: admin_get_tenant_secret)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/secrets/:key","mcp_tool":"admin_get_tenant_secret","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"key":{"type":"string","required":true,"description":"The secret key name"}}}},{"id":"admin_delete_tenant_secret","name":"Delete a secret (admin — no denylist)","description":"Admins can delete ANY key including system-managed secrets. Use with extreme caution.\n","tags":["api","operation","delete","secrets-admin"],"examples":["Invoke DELETE /:possibilityId/secrets/:key (mcp tool: admin_delete_tenant_secret)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/secrets/:key","mcp_tool":"admin_delete_tenant_secret","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"key":{"type":"string","required":true,"description":"The secret key name to delete"}}}},{"id":"admin_get_secrets_metadata","name":"Get secrets metadata (admin)","description":"Get secrets metadata (admin)","tags":["api","operation","get","secrets-admin"],"examples":["Invoke GET /:possibilityId/secrets/_meta (mcp tool: admin_get_secrets_metadata)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/secrets/_meta","mcp_tool":"admin_get_secrets_metadata","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"list_tenant_secrets","name":"List secret key names","description":"Returns all secret key names for the Possibility. Values are NOT included. Each key is annotated with `system: true/false` to indicate whether it is system-managed.\n","tags":["api","operation","get","secrets"],"examples":["Invoke GET /:possibilityId/secrets (mcp tool: list_tenant_secrets)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/secrets","mcp_tool":"list_tenant_secrets","docs_url":"https://possibility.space/docs/api/secrets-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"get_secrets_metadata","name":"Get secrets metadata","description":"Returns total, system, and user secret counts for the Possibility, plus vault health status. No values are exposed.\n","tags":["api","operation","get","secrets"],"examples":["Invoke GET /:possibilityId/secrets/_meta (mcp tool: get_secrets_metadata)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/secrets/_meta","mcp_tool":"get_secrets_metadata","docs_url":"https://possibility.space/docs/api/secrets-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"list_specs","name":"Get spec manifest in KAML format","description":"Get spec manifest in KAML format","tags":["api","operation","get","spec"],"examples":["Invoke GET /index.kno (mcp tool: list_specs)"],"x-pspace-parameters-schema":{"method":"GET","path":"/index.kno","mcp_tool":"list_specs","docs_url":"https://possibility.space/docs/api/spec-api","properties":{}}},{"id":"get_spec","name":"Get spec by ID (latest version)","description":"Returns the raw KAML spec file for the specified spec","tags":["api","operation","get","spec"],"examples":["Invoke GET /{spec}.kno (mcp tool: get_spec)"],"x-pspace-parameters-schema":{"method":"GET","path":"/{spec}.kno","mcp_tool":"get_spec","docs_url":"https://possibility.space/docs/api/spec-api","properties":{"spec":{"type":"string","required":true,"description":"Spec identifier (e.g., user, organization, api-spec)"}}}},{"id":"get_storage_status","name":"Check storage health","description":"Check storage health","tags":["api","operation","get","storage"],"examples":["Invoke GET /:possibilityId/storage (mcp tool: get_storage_status)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/storage","mcp_tool":"get_storage_status","docs_url":"https://possibility.space/docs/api/storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"provision_storage","name":"Provision storage","description":"Provision storage","tags":["api","operation","post","storage"],"examples":["Invoke POST /:possibilityId/storage (mcp tool: provision_storage)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/storage","mcp_tool":"provision_storage","docs_url":"https://possibility.space/docs/api/storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"deprovision_storage","name":"Deprovision storage","description":"Deprovision storage","tags":["api","operation","delete","storage"],"examples":["Invoke DELETE /:possibilityId/storage (mcp tool: deprovision_storage)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/storage","mcp_tool":"deprovision_storage","docs_url":"https://possibility.space/docs/api/storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"reprovision_storage","name":"Reprovision failed capabilities","description":"Reprovision failed capabilities","tags":["api","operation","post","storage"],"examples":["Invoke POST /:possibilityId/storage/reprovision (mcp tool: reprovision_storage)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/storage/reprovision","mcp_tool":"reprovision_storage","docs_url":"https://possibility.space/docs/api/storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"get_storage_metrics","name":"Get storage metrics","description":"Get storage metrics","tags":["api","operation","get","storage"],"examples":["Invoke GET /:possibilityId/storage/metrics (mcp tool: get_storage_metrics)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/storage/metrics","mcp_tool":"get_storage_metrics","docs_url":"https://possibility.space/docs/api/storage-api","properties":{"possibilityId":{"type":"string","required":true,"description":"Immutable ULID of the possibility"}}}},{"id":"admin_create_tenant_user","name":"Create a new user (admin)","description":"Create a new user (admin)","tags":["api","operation","post","tenant-users-admin"],"examples":["Invoke POST /:possibilityId/users (mcp tool: admin_create_tenant_user)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/users","mcp_tool":"admin_create_tenant_user","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_list_tenant_users","name":"List users (admin)","description":"List users (admin)","tags":["api","operation","get","tenant-users-admin"],"examples":["Invoke GET /:possibilityId/users (mcp tool: admin_list_tenant_users)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users","mcp_tool":"admin_list_tenant_users","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_bulk_import_tenant_users","name":"Bulk import users (admin)","description":"Bulk import users (admin)","tags":["api","operation","post","tenant-users-admin"],"examples":["Invoke POST /:possibilityId/users/import (mcp tool: admin_bulk_import_tenant_users)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/users/import","mcp_tool":"admin_bulk_import_tenant_users","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_bulk_export_tenant_users","name":"Export users (admin)","description":"Export users (admin)","tags":["api","operation","get","tenant-users-admin"],"examples":["Invoke GET /:possibilityId/users/export (mcp tool: admin_bulk_export_tenant_users)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users/export","mcp_tool":"admin_bulk_export_tenant_users","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"}}}},{"id":"admin_get_tenant_user","name":"Get a single user (admin)","description":"Get a single user (admin)","tags":["api","operation","get","tenant-users-admin"],"examples":["Invoke GET /:possibilityId/users/:userId (mcp tool: admin_get_tenant_user)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users/:userId","mcp_tool":"admin_get_tenant_user","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"admin_update_tenant_user","name":"Update user fields (admin)","description":"Update user fields (admin)","tags":["api","operation","patch","tenant-users-admin"],"examples":["Invoke PATCH /:possibilityId/users/:userId (mcp tool: admin_update_tenant_user)"],"x-pspace-parameters-schema":{"method":"PATCH","path":"/:possibilityId/users/:userId","mcp_tool":"admin_update_tenant_user","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"admin_delete_tenant_user","name":"Soft-delete a user (admin)","description":"Soft-delete a user (admin)","tags":["api","operation","delete","tenant-users-admin"],"examples":["Invoke DELETE /:possibilityId/users/:userId (mcp tool: admin_delete_tenant_user)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/users/:userId","mcp_tool":"admin_delete_tenant_user","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"admin_set_tenant_user_custom_data","name":"Set (merge) custom data (admin)","description":"Set (merge) custom data (admin)","tags":["api","operation","put","tenant-users-admin"],"examples":["Invoke PUT /:possibilityId/users/:userId/data (mcp tool: admin_set_tenant_user_custom_data)"],"x-pspace-parameters-schema":{"method":"PUT","path":"/:possibilityId/users/:userId/data","mcp_tool":"admin_set_tenant_user_custom_data","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"admin_get_tenant_user_custom_data","name":"Get all custom data (admin)","description":"Get all custom data (admin)","tags":["api","operation","get","tenant-users-admin"],"examples":["Invoke GET /:possibilityId/users/:userId/data (mcp tool: admin_get_tenant_user_custom_data)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users/:userId/data","mcp_tool":"admin_get_tenant_user_custom_data","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"admin_delete_tenant_user_custom_data_key","name":"Remove a custom data key (admin)","description":"Remove a custom data key (admin)","tags":["api","operation","delete","tenant-users-admin"],"examples":["Invoke DELETE /:possibilityId/users/:userId/data/:key (mcp tool: admin_delete_tenant_user_custom_data_key)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/users/:userId/data/:key","mcp_tool":"admin_delete_tenant_user_custom_data_key","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"},"key":{"type":"string","required":true,"description":"The custom_data key to delete"}}}},{"id":"create_tenant_user","name":"Create a new user","description":"Creates a user record in the Possibility's tenant database. Email must be unique within the Possibility. Optionally attach initial custom_data (max 50 keys, max depth 3).\nThis is the tenant-application user-table path. Do not route app-user imports or mail-domain isolation tests to `/invites`; the invite surface is for Possibility collaboration/onboarding or explicit auth-zone onboarding email.\nTo enable OIDC sign-in for the user, set `provision_identity: true` — this also creates an identity in the Possibility's auth zone and populates `auth_subject` on the returned user. Set `send_invite_email: true` to dispatch a password-setup / email-verification invite at the same time. Both flags default to `false` for backward compatibility.\nInvitation mail (#4007): passing any of `inviter_name`, `possibility_name`, or `purpose` (with `provision_identity` and `send_invite_email` both true) selects an invitation-toned mail composed and sent by the platform on the Possibility's verified sender — it says who invited the recipient, to what, and that the link sets their password to accept, and it carries a single-use invite token (7-day expiry, stated in the mail). `invite_landing_url` is REQUIRED with invite params: the mail link is that URL with `?token=…` appended, and its origin must be among the tenant app client's registered redirect-URI origins — an unregistered origin refuses the whole request (422, nothing is created; there is no derived-URL fallback). The landing page must POST the token to the complete-invite verb — never consume it on a GET. Without invite params the behavior is exactly the pre-#4007 auth-zone mail, byte for byte.\n","tags":["api","operation","post","tenant-users"],"examples":["Invoke POST /:possibilityId/users (mcp tool: create_tenant_user)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/users","mcp_tool":"create_tenant_user","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"email":{"type":"string","required":true,"description":"required, email format, max 255"},"first_name":{"type":"string","required":false,"description":"optional, max 255"},"last_name":{"type":"string","required":false,"description":"optional, max 255"},"display_name":{"type":"string","required":false,"description":"optional, max 255"},"custom_data":{"type":"object","required":false,"description":"optional, max 50 keys, max depth 3"},"provision_identity":{"type":"boolean","required":false,"description":". When true, creates a corresponding identity in the Possibility's auth zone so the user can authenticate via OIDC. The auth-zone identity subject is stored in `auth_subject` on the returned user."},"send_invite_email":{"type":"boolean","required":false,"description":". When true (and `provision_identity` is also true), sends the user an invite email to set their password and verify their email. Email failures are non-fatal — the user is still created and a `warning: \"invite_email_failed\"` field is included in the response."},"inviter_name":{"type":"string","required":false,"description":". Display name of the person who sent the invitation. Presence of any invite param (inviter_name / possibility_name / purpose) selects the platform-composed invitation mail (#4007) and requires `invite_landing_url` plus both provisioning flags."},"possibility_name":{"type":"string","required":false,"description":". Display name of the Possibility in the invitation copy. When omitted while other invite params are present, it is derived from the auth service-config branding display name, then the tenant auth zone's display name, then the Possibility slug."},"purpose":{"type":"string","required":false,"description":". Optional line telling the recipient why they are being invited; rendered as a distinct block in the invitation mail."},"invite_landing_url":{"type":"string","required":false,"description":". REQUIRED when invite params are present. The estate's finish-account page for THIS invitation — the mail link is this URL with `?token=…` appended. Validated at ORIGIN level against the tenant app client's registered redirect-URI origins; an unregistered origin refuses the request (422) and nothing is created. There is no derived-URL fallback. The landing page must POST the token — never consume it on a GET (link-scanner prefetch would burn the single-use token)."}}}},{"id":"list_tenant_users","name":"List users (paginated)","description":"Returns a paginated, filterable list of users. Supports status filter, text search (email, names), and pagination controls.\n","tags":["api","operation","get","tenant-users"],"examples":["Invoke GET /:possibilityId/users (mcp tool: list_tenant_users)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users","mcp_tool":"list_tenant_users","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"status":{"type":"string","required":false,"description":"Filter by status: active | suspended | deleted"},"limit":{"type":"integer","required":false,"description":"Page size (1–100, default 20)"},"offset":{"type":"integer","required":false,"description":"Number of records to skip (default 0)"},"search":{"type":"string","required":false,"description":"Search across email, first_name, last_name, display_name (ILIKE)"}}}},{"id":"bulk_import_tenant_users","name":"Bulk import users from JSON array","description":"Accepts an array of 1–1000 user objects. Each is inserted independently; duplicates or invalid rows are captured in the errors array. Returns 201 on full success, 207 on partial.\n","tags":["api","operation","post","tenant-users"],"examples":["Invoke POST /:possibilityId/users/import (mcp tool: bulk_import_tenant_users)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/users/import","mcp_tool":"bulk_import_tenant_users","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"users":{"type":"array","required":false,"description":"1–1000"}}}},{"id":"bulk_export_tenant_users","name":"Export users as JSON","description":"Returns every user in the Possibility's tenant database. Optionally filter by status query parameter.\n","tags":["api","operation","get","tenant-users"],"examples":["Invoke GET /:possibilityId/users/export (mcp tool: bulk_export_tenant_users)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users/export","mcp_tool":"bulk_export_tenant_users","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"status":{"type":"string","required":false,"description":"Filter by status: active | suspended | deleted"}}}},{"id":"get_tenant_user","name":"Get a single user","description":"Returns all fields for the specified user.","tags":["api","operation","get","tenant-users"],"examples":["Invoke GET /:possibilityId/users/:userId (mcp tool: get_tenant_user)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users/:userId","mcp_tool":"get_tenant_user","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"update_tenant_user","name":"Update user fields","description":"Partial update — only provided fields are changed. Email uniqueness is enforced. Status can be set to active or suspended (use DELETE for soft-delete).\n","tags":["api","operation","patch","tenant-users"],"examples":["Invoke PATCH /:possibilityId/users/:userId (mcp tool: update_tenant_user)"],"x-pspace-parameters-schema":{"method":"PATCH","path":"/:possibilityId/users/:userId","mcp_tool":"update_tenant_user","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"},"email":{"type":"string","required":false,"description":"optional"},"first_name":{"type":"string","required":false,"description":"optional, nullable"},"last_name":{"type":"string","required":false,"description":"optional, nullable"},"display_name":{"type":"string","required":false,"description":"optional, nullable"},"avatar_url":{"type":"string","required":false,"description":"optional, nullable, URL format"},"status":{"type":"string","required":false,"description":"optional, active | suspended"},"custom_data":{"type":"object","required":false,"description":"optional, max 50 keys, max depth 3"}}}},{"id":"delete_tenant_user","name":"Soft-delete a user","description":"Sets the user's status to \"deleted\". The record is retained for audit purposes. Deleting an already-deleted user returns 404.\n","tags":["api","operation","delete","tenant-users"],"examples":["Invoke DELETE /:possibilityId/users/:userId (mcp tool: delete_tenant_user)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/users/:userId","mcp_tool":"delete_tenant_user","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"link_tenant_user_auth","name":"Provision or attach an auth-zone identity","description":"Two modes selected by the `method` field:\n* `method: \"create\"` — creates a new identity in the\n  Possibility's auth zone using the tenant user's email and\n  sets `auth_subject`. Optionally dispatches an invite email\n  via `send_invite_email: true`.\n* `method: \"link\"` — attaches the tenant user to an existing\n  identity by setting `auth_subject` to the supplied subject.\n  No auth-zone writes occur.\n\nRefuses to overwrite an existing `auth_subject` (returns 409 with `error: \"already_linked\"`).\nInvitation mail (#4007, `method: \"create\"` only): the same invite params as user creation — any of `inviter_name`, `possibility_name`, `purpose` (with `send_invite_email: true`) selects the platform-composed invitation mail carrying a single-use invite token, and requires `invite_landing_url` whose origin is validated against the tenant app client's registered redirect-URI origins (unregistered origin → 422, nothing is linked; no derived-URL fallback). Without invite params, the pre-#4007 auth-zone mail is sent byte-identically.\n","tags":["api","operation","post","tenant-users"],"examples":["Invoke POST /:possibilityId/users/:userId/link-auth (mcp tool: link_tenant_user_auth)"],"x-pspace-parameters-schema":{"method":"POST","path":"/:possibilityId/users/:userId/link-auth","mcp_tool":"link_tenant_user_auth","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ULID of the tenant user"},"method":{"type":"string","required":true,"description":"required, discriminator"},"send_invite_email":{"type":"boolean","required":false,"description":"optional, default false; only valid when method=\"create\""},"auth_subject":{"type":"string","required":true,"description":"required when method=\"link\""},"inviter_name":{"type":"string","required":false,"description":"selects the platform-composed invitation mail (#4007)"},"possibility_name":{"type":"string","required":false,"description":"invitation display name; derived from auth branding, then the auth zone display name, then the slug when omitted"},"purpose":{"type":"string","required":false,"description":"why the recipient is invited"},"invite_landing_url":{"type":"string","required":true,"description":"finish-account page for this invitation; the mail link is this URL with `?token=…` appended; origin must be registered on the tenant app client (no derived-URL fallback; the page must POST the token, never consume it on GET)"}}}},{"id":"set_tenant_user_custom_data","name":"Set (merge) custom data","description":"Merges the provided keys into the user's existing custom_data via JSONB concatenation. Post-merge validation ensures the total key count does not exceed 50; if it does, the merge is rolled back and 400 is returned.\n","tags":["api","operation","put","tenant-users"],"examples":["Invoke PUT /:possibilityId/users/:userId/data (mcp tool: set_tenant_user_custom_data)"],"x-pspace-parameters-schema":{"method":"PUT","path":"/:possibilityId/users/:userId/data","mcp_tool":"set_tenant_user_custom_data","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"},"[key]":{"type":"string","required":false,"description":"max depth 3"}}}},{"id":"get_tenant_user_custom_data","name":"Get all custom data","description":"Returns the user's full custom_data object. Returns {} if no custom data has been set.\n","tags":["api","operation","get","tenant-users"],"examples":["Invoke GET /:possibilityId/users/:userId/data (mcp tool: get_tenant_user_custom_data)"],"x-pspace-parameters-schema":{"method":"GET","path":"/:possibilityId/users/:userId/data","mcp_tool":"get_tenant_user_custom_data","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"}}}},{"id":"delete_tenant_user_custom_data_key","name":"Remove a custom data key","description":"Removes the specified key from the user's custom_data JSONB. Returns the remaining custom_data after removal.\n","tags":["api","operation","delete","tenant-users"],"examples":["Invoke DELETE /:possibilityId/users/:userId/data/:key (mcp tool: delete_tenant_user_custom_data_key)"],"x-pspace-parameters-schema":{"method":"DELETE","path":"/:possibilityId/users/:userId/data/:key","mcp_tool":"delete_tenant_user_custom_data_key","docs_url":"https://possibility.space/docs/api/tenant-users-api","properties":{"possibilityId":{"type":"string","required":true,"description":"ULID of the Possibility"},"userId":{"type":"string","required":true,"description":"ID of the user within the tenant"},"key":{"type":"string","required":true,"description":"The custom_data key to delete"}}}},{"id":"users_get_current","name":"Get current user with local role","description":"Get current user with local role","tags":["api","operation","get","users"],"examples":["Invoke GET /admin/users/me (mcp tool: users_get_current)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/users/me","mcp_tool":"users_get_current","properties":{"sub":{"type":"string","required":true,"description":"Auth provider subject ID"},"email":{"type":"string","required":false,"description":"Email for auto-create/link if user doesn't exist"},"name":{"type":"string","required":false,"description":"Name for auto-create if user doesn't exist"}}}},{"id":"users_list","name":"List users with pagination","description":"List users with pagination","tags":["api","operation","get","users"],"examples":["Invoke GET /admin/users (mcp tool: users_list)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/users","mcp_tool":"users_list","properties":{"page":{"type":"integer","required":false,"description":"Page number (default: 1)"},"pageSize":{"type":"integer","required":false,"description":"Items per page (default: 20)"},"search":{"type":"string","required":false,"description":"Search filter for name/email"}}}},{"id":"users_lookup","name":"Lookup user by email address","description":"Lookup user by email address","tags":["api","operation","get","users"],"examples":["Invoke GET /admin/users/lookup (mcp tool: users_lookup)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/users/lookup","mcp_tool":"users_lookup","properties":{"email":{"type":"string","required":true,"description":"Email address to look up"}}}},{"id":"users_get","name":"Get user details with role","description":"Get user details with role","tags":["api","operation","get","users"],"examples":["Invoke GET /admin/users/{id} (mcp tool: users_get)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/users/{id}","mcp_tool":"users_get","properties":{"id":{"type":"string","required":true,"description":"Auth provider user ID"}}}},{"id":"list_user_personas","name":"List personas for a user","description":"List personas for a user","tags":["api","operation","get","users"],"examples":["Invoke GET /admin/users/{userId}/personas (mcp tool: list_user_personas)"],"x-pspace-parameters-schema":{"method":"GET","path":"/admin/users/{userId}/personas","mcp_tool":"list_user_personas","properties":{"userId":{"type":"string","required":true,"description":"Possibility user ID (usr_*) or auth_subject"}}}},{"id":"cap-activity-list-fixture-corpus","name":"Activity: List the activity fixture corpus","description":"The produced, contract-tested fixture corpus behind the three kinds: fifteen fixtures — rows for the estate's own automation, an attested change, a subject the host cannot resolve, the agent spelling, a legacy key and a comment reference; streams for the empty window, the three comment kinds, goal changes, a cross-project record in both project streams, the audience filter and a task window; motion lines quiet and in a window — each a complete rendering-contract envelope produced over the spine's own record vectors. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","activity","activity","history","fixtures","conformance","preview","read"]},{"id":"cap-attestation-list-fixture-corpus","name":"Attestation: List the attestation fixture corpus","description":"The produced, contract-tested fixture corpus behind the three kinds: thirteen fixtures — the ask over an agent-proposed task, over a goal, over a confirmed task and over a subject the host cannot resolve; receipts for a confirm on a task and on a goal through the agent door, the cleared confirmation on the web, a dependency verdict, a capture dismissal and a foreign subject; the queue populated with tasks and goals, empty, and with a foreign entry — each a complete rendering-contract envelope produced over the block's own golden records. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","attestation","attestation","confirm","fixtures","conformance","preview","read"]},{"id":"cap-auth-realm-provision-realm","name":"Login with Possibility: Provision Auth Zone","description":"Create and configure an isolated per-Possibility auth zone with:\n- Standard auth zone settings (token lifetimes, login options)\n- Default OIDC client (`pspace-{slug}-app`) with OAuth 2.1 + PKCE\n- OIDC discovery at\n  `https://api.possibility.space/auth/{possibility_id}/.well-known/openid-configuration`\n","tags":["capability","auth-realm","auth","provisioning"]},{"id":"cap-auth-realm-configure-branding","name":"Login with Possibility: Configure Branding","description":"Apply Possibility-specific brand colors and logo to the auth zone's\nlogin, registration, and error pages.\n","tags":["capability","auth-realm","auth","branding"]},{"id":"cap-auth-realm-configure-smtp","name":"Login with Possibility: Configure SMTP","description":"Set up per-Possibility email sender configuration using the\nPossibility's email domain and platform email relay. Enables\npassword reset, email verification, and admin notifications.\n","tags":["capability","auth-realm","auth","email","smtp"]},{"id":"cap-birdwork-insight-blocks-list-block-catalog","name":"Birdwork Insight Blocks: List the insight-block catalog","description":"The closed block-kind vocabulary with its authority classes and invariants — situate / disclosure / reroute / projection / plan-why (class I: inform), tradeoff / verdict / paths-out / workshop (class C: choose), consent / receipt / batch-consent (class A: approve) — plus the cross-cutting rules agents must honor when offering blocks: question-shaped headers (never taxonomy names), one decision at a time, interruption tiers only escalate, acted cards become receipts, and every presentation emits an Offer activity. Constants only: no store read, trivially read-only (the list-lenses precedent).","tags":["capability","birdwork-insight-blocks","insight-blocks","discovery","read"]},{"id":"cap-capability-config-list-installed","name":"Capability Config: List installed capabilities","description":"List the capabilities installed on the Possibility with their lifecycle state (reads GET /admin/possibilities/{id}/capabilities).","tags":["capability","capability-config","config","admin","read"]},{"id":"cap-capability-config-describe-config","name":"Capability Config: Describe a capability's config","description":"For an installed capability, derive the config variables it requires from its manifest — the user-supplied secret-store keys (atoms[type=secret-store].config.secrets[] where generated:false) and their storage path_template — plus its required_permissions. No per-capability wiring; pure manifest introspection.","tags":["capability","capability-config","config","admin","read"]},{"id":"cap-capability-config-get-config-status","name":"Capability Config: Report config status","description":"Report which of a capability's required variables are set versus still missing, WITHOUT revealing secret values — the \"what still needs configuring\" view.","tags":["capability","capability-config","config","admin","read"]},{"id":"cap-capability-config-preview-capability","name":"Capability Config: Preview a capability","description":"For any capability, detect whether it declares a preview skill (the ratified convention: invocation.mcp_tool matching ^list_.*_fixtures$) and, when it does, invoke that door and return its contract-checked fixture corpus — so a browse surface can show what the capability looks like before it is installed or configured. Generic manifest introspection plus one door call; no per-capability wiring. Answers honestly when a capability declares no preview.","tags":["capability","capability-config","config","preview","browse","read"]},{"id":"cap-capability-config-set-variable","name":"Capability Config: Set a config variable","description":"Write a value for one of a capability's declared variables into its secret-store path (config.secrets[].key -> path_template). Privileged: gated by an owner-attestation JWT proving the caller is a current organizer of the Possibility.","tags":["capability","capability-config","config","admin","write"]},{"id":"cap-capability-config-list-installed","name":"Capability Config: List installed capabilities","description":"List the capabilities installed on the Possibility with their lifecycle state (GET /admin/possibilities/{id}/capabilities; MCP tool list_installed_capabilities).","tags":["capability","capability-config","config","admin","read"]},{"id":"cap-capability-config-describe-config","name":"Capability Config: Describe a capability's config","description":"For an installed capability, derive the config variables it requires from its manifest — the user-supplied secret-store keys (atoms[type=secret-store].config.secrets[] where generated:false) and the non-secret config variables (atoms[type=config].config.variables[]), each tagged kind:secret|config, with their storage path_template — plus its required_permissions. No per-capability wiring; pure manifest introspection. Non-conforming manifests degrade honestly (conforms:false + degrade_reason).","tags":["capability","capability-config","config","admin","read"]},{"id":"cap-capability-config-get-config-status","name":"Capability Config: Report config status","description":"Report which of a capability's declared variables are set versus still missing — the \"what still needs configuring\" view. Secret values are never revealed (presence only); non-secret config variables include their stored value, default, and whether they are required.","tags":["capability","capability-config","config","admin","read"]},{"id":"cap-capability-config-set-variable","name":"Capability Config: Set a config variable","description":"Write a value for one of a capability's declared variables into its declared path (config.secrets[].key or config.variables[].key -> path_template). Read-merge-write; scoped to declared user-supplied variables only; config values are validated against their declared format (url, enum); the value is never logged and never echoed.","tags":["capability","capability-config","config","admin","write"]},{"id":"cap-capture-list-fixture-corpus","name":"Capture: List the capture fixture corpus","description":"The produced, contract-tested fixture corpus behind the three kinds: eleven fixtures — cards for a pending capture with the declared threshold and without, a kept one, dismissals by a human with a reason, with the explicit null reason and by the estate (auto-suppressed), one sent to the council, and a foreign-state row; the queue populated and empty; the dismiss ask — each a complete rendering-contract envelope produced over the block's own golden records. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","capture","capture","triage","fixtures","conformance","preview","read"]},{"id":"cap-edges-list-fixture-corpus","name":"Edges: List the edge fixture corpus","description":"The produced, contract-tested fixture corpus behind the three kinds: eleven fixtures — the edge list as a hub of all five families, the far end of an undirected relation, a dangling target, the empty list, a scrambled input in the ruled order; blocked-by blocked, cleared, dangling and inferred; sub-steps from both containment carriers and in progress — each a complete rendering-contract envelope whose edges are the plane corpus's CV-P edge-materialization vectors verbatim. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","edges","edges","relations","fixtures","conformance","preview","read"]},{"id":"cap-entity-list-fixture-corpus","name":"Entity: List the entity fixture corpus","description":"The produced, contract-tested fixture corpus behind the two kinds: six fixtures — a human, an agent, a system, an unresolved ref, a labelled scope and a bare scope — each a complete rendering-contract envelope with the projection that produced it. The type on a chip is the frame-asserted property from contract 0.2.0, never inferred from the id. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","entity","entity","scope","fixtures","conformance","preview","read"]},{"id":"cap-entity-graph-query-entity-candidates","name":"Entity Graph: Query entity candidates","description":"Suggest/typeahead over the Possibility's own people-shaped entities. Query travels in the POST body; handle sources at static defaults are slug and real name (email search ships off); results are authorization-filtered with a not-found posture — private and nonexistent principals are indistinguishable, in rows and counts alike.","tags":["capability","entity-graph","graph","suggest","read"]},{"id":"cap-entity-mention-list-entity-references","name":"Entity Mention: List entity references","description":"The inbound projection — which hosts in this Possibility reference a target, derived at query time and never stored. The target defaults to the caller (\"references of me\"). A target with no visible references, a target outside the Possibility, and a nonexistent target are byte-identical responses, in rows and counts alike.","tags":["capability","entity-mention","graph","references","read"]},{"id":"cap-entity-mention-resolve-entity-references","name":"Entity Mention: Resolve entity references","description":"Live display resolution for a batch of reference targets through the four-state matrix — resolved, masked, deleted, unavailable. Labels are re-resolved on every call; the stored authoring-time snapshot is never a display source. Targets travel in the POST body so batches never land in access logs; per-entry failures degrade that entry without failing the batch.","tags":["capability","entity-mention","graph","references","read"]},{"id":"cap-foundry-domain-orchestrator-domain/provision","name":"Foundry Domain Orchestrator: Provision Domain","description":"Provisions a custom domain via Possibility platform and your own Cloudflare account. Requires a Cloudflare API Token.","tags":["capability","foundry-domain-orchestrator","domain","dns","cloudflare"]},{"id":"cap-foundry-domain-orchestrator-domain/verify-token","name":"Foundry Domain Orchestrator: Verify Cloudflare Token","description":"Validates your Cloudflare API token permissions to ensure it can manage DNS for the target zone.","tags":["capability","foundry-domain-orchestrator","security","cloudflare"]},{"id":"cap-foundry-domain-orchestrator-secrets/setup-cloudflare","name":"Foundry Domain Orchestrator: Setup Cloudflare Secret","description":"Assists in saving your Cloudflare API token to your OWN Possibility's secure vault for use by agents.","tags":["capability","foundry-domain-orchestrator","setup","secrets","security"]},{"id":"cap-foundry-domain-orchestrator-domain/diagnostics","name":"Foundry Domain Orchestrator: Connectivity Diagnostics","description":"Runs diagnostic self-tests to verify the integration between the Orchestrator, Cloudflare, and the Platform.","tags":["capability","foundry-domain-orchestrator","diagnostics","discovery"]},{"id":"cap-foundry-domain-orchestrator-cloudflare/deploy-hono","name":"Foundry Domain Orchestrator: Deploy Hono Cloudflare Worker","description":"Deploys a dynamic \"Hello World\" Edge API via Cloudflare Workers and Hono.","tags":["capability","foundry-domain-orchestrator","cloudflare","edge","compute"]},{"id":"cap-github-auth-connect-github","name":"GitHub Authentication: Connect GitHub","description":"Run the GitHub App user-to-server OAuth flow (authorization-code exchange) and store the resulting refresh token + access token; verify with a GET /user call (200 = valid).","tags":["capability","github-auth","auth","github","oauth"]},{"id":"cap-github-auth-refresh-access-token","name":"GitHub Authentication: Refresh access token","description":"Exchange the stored refresh token for a new user-to-server access token when the current one (~8h TTL) has expired.","tags":["capability","github-auth","auth","github","oauth"]},{"id":"cap-github-auth-verify-credential","name":"GitHub Authentication: Verify GitHub credential","description":"Confirm the stored credential still works — GET /user returns 200; 401 means invalid, 403 means rate-limited or insufficient permission.","tags":["capability","github-auth","auth","github"]},{"id":"cap-github-auth-revoke-credential","name":"GitHub Authentication: Revoke GitHub credential","description":"Remove the stored GitHub credential for the Possibility.","tags":["capability","github-auth","auth","github"]},{"id":"cap-github-issues-list-assigned-issues","name":"GitHub Issues: List assigned issues","description":"GET /issues — issues assigned to the authenticated user across visible repositories. Query: filter (assigned/created/mentioned/subscribed/repos/ all), state (open/closed/all), labels, sort (created/updated/comments), direction, since; per_page <= 100. May include pull requests.","tags":["capability","github-issues","github","issues","read"]},{"id":"cap-github-issues-list-repo-issues","name":"GitHub Issues: List repository issues","description":"GET /repos/{owner}/{repo}/issues — issues in a single repository.","tags":["capability","github-issues","github","issues","read"]},{"id":"cap-github-issues-get-issue","name":"GitHub Issues: Get an issue","description":"GET /repos/{owner}/{repo}/issues/{issue_number} — one issue by number.","tags":["capability","github-issues","github","issues","read"]},{"id":"cap-github-issues-create-issue","name":"GitHub Issues: Create an issue","description":"POST /repos/{owner}/{repo}/issues — title (required); optional body, labels, assignees, milestone.","tags":["capability","github-issues","github","issues","write"]},{"id":"cap-github-issues-update-issue","name":"GitHub Issues: Update an issue","description":"PATCH /repos/{owner}/{repo}/issues/{issue_number} — title, body, state (open/closed), state_reason, labels, assignees.","tags":["capability","github-issues","github","issues","write"]},{"id":"cap-goal-card-list-fixture-corpus","name":"Goal — card: List the goal fixture corpus","description":"The produced, contract-tested fixture corpus behind the four kinds: eight fixtures — goal cards with dates, without dates, graded with note, ungraded with attainment; the key-result assessment (ungraded, already graded) and disposition (pending) moments; a projection — each a complete rendering-contract envelope with the plane objects that produced it. The grade on any fixture is a human record, never computed from the measure. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","goal-card","goals","key-results","fixtures","conformance","preview","read"]},{"id":"cap-google-auth-connect-google","name":"Google Authentication: Connect Google","description":"Run the OAuth 2.0 web-server flow (authorization-code exchange) for the requested scopes and store the resulting refresh token + access token.","tags":["capability","google-auth","auth","google","oauth2"]},{"id":"cap-google-auth-refresh-access-token","name":"Google Authentication: Refresh access token","description":"Exchange the stored refresh token for a new access token when the current one has expired.","tags":["capability","google-auth","auth","google","oauth2"]},{"id":"cap-google-auth-verify-credential","name":"Google Authentication: Verify Google credential","description":"Confirm the stored credential still works and report the granted scopes; a revoked or expired refresh token requires re-running connect-google.","tags":["capability","google-auth","auth","google"]},{"id":"cap-google-auth-revoke-credential","name":"Google Authentication: Revoke Google credential","description":"Revoke and remove the stored Google credential for the Possibility.","tags":["capability","google-auth","auth","google"]},{"id":"cap-google-drive-list-files","name":"Google Drive: List & search files","description":"GET /files — list or search files and folders with a Drive query (`q`), ordered (e.g. `orderBy=modifiedTime desc`) and paged via `pageSize` + `nextPageToken`. Pass `supportsAllDrives`, `includeItemsFromAllDrives`, and `corpora=allDrives` to include Shared Drives; select returned columns with `fields`.","tags":["capability","google-drive","google","drive","read"]},{"id":"cap-google-drive-get-file","name":"Google Drive: Get file metadata","description":"GET /files/{fileId} — a single file's metadata (id, name, mimeType, parents, driveId, shared, modifiedTime). Use `supportsAllDrives=true` for Shared Drive items.","tags":["capability","google-drive","google","drive","read"]},{"id":"cap-google-drive-export-file","name":"Google Drive: Export a Google-native document","description":"GET /files/{fileId}/export?mimeType=... — export a Google-native document (Docs / Sheets / Slides) to a chosen MIME type, e.g. text/plain, since native files have no directly downloadable bytes.","tags":["capability","google-drive","google","drive","read"]},{"id":"cap-google-drive-download-file","name":"Google Drive: Download a binary file","description":"GET /files/{fileId}?alt=media — download the bytes of a non-native (binary) file. Native Google files use export-file instead.","tags":["capability","google-drive","google","drive","read"]},{"id":"cap-google-gmail-list-labels","name":"Gmail: List labels","description":"GET /users/me/labels — the user's Gmail labels (system labels like INBOX / UNREAD / STARRED and user-created labels), each with id, name, and type.","tags":["capability","google-gmail","google","gmail","read"]},{"id":"cap-google-gmail-list-messages","name":"Gmail: List & search messages","description":"GET /users/me/messages — message stubs filtered by `labelIds` and a Gmail search query (`q`, e.g. `is:unread`), capped by `maxResults` and paged via `nextPageToken`. Returns `{id, threadId}` only; fetch content with get-message.","tags":["capability","google-gmail","google","gmail","read"]},{"id":"cap-google-gmail-get-message","name":"Gmail: Get a message","description":"GET /users/me/messages/{id} — a single message. `format` selects detail (full / metadata / minimal / raw); the subject is in `payload.headers` and a short preview is in `snippet`.","tags":["capability","google-gmail","google","gmail","read"]},{"id":"cap-google-tasks-list-tasklists","name":"Google Tasks: List task lists","description":"GET /users/@me/lists — the user's task lists (paged by maxResults).","tags":["capability","google-tasks","google","tasks","read"]},{"id":"cap-google-tasks-list-tasks","name":"Google Tasks: List tasks","description":"GET /lists/{tasklist}/tasks — tasks in a list. Use showCompleted + showHidden to retrieve completed/hidden tasks for sync; pages via maxResults + nextPageToken.","tags":["capability","google-tasks","google","tasks","read"]},{"id":"cap-google-tasks-get-task","name":"Google Tasks: Get a task","description":"GET /lists/{tasklist}/tasks/{task} — a single task.","tags":["capability","google-tasks","google","tasks","read"]},{"id":"cap-google-tasks-create-task","name":"Google Tasks: Create a task","description":"POST /lists/{tasklist}/tasks — title (and optional notes, due). `due` wants an RFC3339 timestamp though Google stores it date-only.","tags":["capability","google-tasks","google","tasks","write"]},{"id":"cap-google-tasks-update-task","name":"Google Tasks: Update a task","description":"PATCH /lists/{tasklist}/tasks/{task} — title, notes, due, or status (needsAction / completed).","tags":["capability","google-tasks","google","tasks","write"]},{"id":"cap-google-tasks-delete-task","name":"Google Tasks: Delete a task","description":"DELETE /lists/{tasklist}/tasks/{task} — remove a task.","tags":["capability","google-tasks","google","tasks","write"]},{"id":"cap-insight-blocks-gallery-list-fixture-corpus","name":"Insight Blocks Gallery: List the fixture corpus","description":"The contract-tested fixture corpus behind the gallery: every fixture with its block kind, authority class (inform | choose | approve), lifecycle state, and section (Grounding | Choices | Approvals) — the golden examples a renderer dialect must display faithfully. Constants only: no store read, trivially read-only (the list-lenses precedent).","tags":["capability","insight-blocks-gallery","insight-blocks","fixtures","conformance","read"]},{"id":"cap-invitations-invite","name":"Invitations: Invite Member","description":"Create an invitation for an email address with a role, and send the\ninvitation mail from the Possibility's sender domain (shared-sender\nfallback until a domain is verified). The invitation is an append-only\nrecord carrying the role to be granted on acceptance.\n","tags":["capability","invitations","invitations","onboarding","email"]},{"id":"cap-invitations-resend-invite","name":"Invitations: Resend Invitation","description":"Re-send the invitation mail for a pending invitation. The invitation\nrecord and its role are unchanged; only delivery is retried.\n","tags":["capability","invitations","invitations","email"]},{"id":"cap-invitations-revoke-invite","name":"Invitations: Revoke Invitation","description":"Revoke a pending invitation so it can no longer be accepted. Revocation\nis a new record, never a deletion — the invitation history survives.\n","tags":["capability","invitations","invitations","revocation"]},{"id":"cap-invitations-list-invites","name":"Invitations: List Invitations","description":"Read the invitation collection: pending, accepted, and revoked\ninvitations, the role each carries, and their delivery history.\n","tags":["capability","invitations","invitations","read-only","audit"]},{"id":"cap-invitations-accept-invites","name":"Invitations: Accept Invitations","description":"On a subject's first authenticated arrival, bind their realm identity to\nany pending invitations for their verified email and compile each into\nan AccessGrantFrame in the permission-frames store (the Birdwork\nmaybeAcceptInvites pattern, generalized). Idempotent; runs in the\nconsuming application's arrival hook, never as an organizer action.\n","tags":["capability","invitations","invitations","grants","arrival"]},{"id":"cap-learn-route-query-query","name":"Learn-Route Query: Query Learning Telemetry","description":"Execute a SELECT / aggregate query over the learning-route telemetry\ntables (route invocations, error envelopes, latency histograms,\nschema-gap detector outputs). Read-only; no DDL, no mutation.\n\nThe platform-internal conduit binds this skill to the platform's OLAP\nquery engine. The Preceptor enforces the read-only scope at every call.\n","tags":["capability","learn-route-query","query","read-only","telemetry"]},{"id":"cap-learn-route-query-schema_introspect","name":"Learn-Route Query: Introspect Telemetry Schema","description":"Describe the available tables, columns, and types in the learning-route\ntelemetry schema. Lets an agent plan a query without out-of-band schema\nknowledge.\n","tags":["capability","learn-route-query","schema","introspection","read-only"]},{"id":"cap-llm-router-route-intent","name":"LLM Router: Route a chat message to an intent","description":"Map a natural-language message to exactly one intent + args from a closed registry. The model selects only — it never authors UI or mutates data.","tags":["capability","llm-router","ai","routing","chat"]},{"id":"cap-llm-router-extract-tasks","name":"LLM Router: Extract tasks","description":"Extract proposed Tasks from free text (transcripts, docs). Proposals only — a human Confirm turns a proposal into company truth.","tags":["capability","llm-router","ai","extraction"]},{"id":"cap-llm-router-extract-goals","name":"LLM Router: Extract goals","description":"Extract proposed Goals/OKRs from free text (proposals only).","tags":["capability","llm-router","ai","extraction"]},{"id":"cap-llm-router-polish-prose","name":"LLM Router: Polish prose","description":"Rewrite prose under a placeholder lock — every reference token preserved exactly once and validated — so wording improves without changing facts.","tags":["capability","llm-router","ai","writing"]},{"id":"cap-merge-reviewer-verdict-page","name":"Merge Reviewer: Read a verdict page","description":"The verdict JSON behind the page an advisory review status links to: the run's projection and its signed record chain from the act core, answered when the link's (run_id, nonce, head_sha) triple matches the run (GET /review/verdict?run_id&nonce&head_sha). No session — the link is the credential; any mismatch is not_found. REST only: the route has no MCP projection (review-api declares it visibility: internal).","tags":["capability","merge-reviewer","review","verdict","read"]},{"id":"cap-merge-reviewer-list-review-runs","name":"Merge Reviewer: List review runs","description":"One page of review runs, newest first, filterable by repository, pull request and state — each with its projection and the pointer to its record chain (GET /admin/review-runs; MCP tool list_review_runs). The nonce, the signed manifest bytes and the delivery payload are never returned.","tags":["capability","merge-reviewer","review","admin","read"]},{"id":"cap-merge-reviewer-get-review-run","name":"Merge Reviewer: Get a review run and its record","description":"The run's projection plus its record — the review-record acts of the run's chain in hop order, each independently verifiable through the act core's inclusion proof, which is what makes the record auditable off the forge (GET /admin/review-runs/{runId}; MCP tool get_review_run).","tags":["capability","merge-reviewer","review","admin","read"]},{"id":"cap-merge-reviewer-bind-repository","name":"Merge Reviewer: Bind a repository to the reviewer","description":"The relation \"this installation reviews THIS forge repository\" (#4216). Binding resolves the repository with the platform's own forge actor, mints a per-hook HMAC secret into the capability's vault leaf (secret/data/pspace/{slug}/merge-reviewer/webhooks/{forge_repository_id}) and records the binding pending; the hook itself is created on the forge by the runner half of the hook lane (.forgejo/workflows/security-merge-reviewer-hook.yml) with a credential the platform never holds, and the lane reports back through the sibling operations activate_repository_binding, unbind_repository, close_repository_binding, rotate_repository_binding and fail_repository_binding; list_repository_bindings / get_repository_binding read the state. Deliveries from a repository with no open binding are recorded repository_unknown and never registered (POST /admin/possibilities/{possibilityId}/capabilities/merge-reviewer/ repository-bindings; MCP tool bind_repository). Never returns a secret; secret_ref is a vault path.","tags":["capability","merge-reviewer","review","admin","write","forge","webhook"]},{"id":"cap-messaging-leave-note","name":"Possibility Messaging: Leave a Note","description":"Leave a note (a feedback finding, question, task, or notice) at an\naddress (repo@branch) or for a persona. Persists on the record\nthrough the single write path; waits at the address until read —\nsurvives sender and receiver session boundaries.\n","tags":["capability","messaging","messaging","feedback"]},{"id":"cap-messaging-check-inbox","name":"Possibility Messaging: Check the Inbox","description":"Checkpoint-based consumption: one unread-count query across\nexplicit addresses and the caller's log-attested participation\naddresses (the zero-config inbox), then catch up on any address\nwith news and mark notes read — read-state visible to the sender\nacross machines. M0 messaging scopes grant operator access;\naddress selection does not prove ownership or membership.\n","tags":["capability","messaging","messaging","consumption"]},{"id":"cap-messaging-add-to","name":"Possibility Messaging: Add a Note to an Address","description":"Attach an accepted note to another address — one durable record\ngains an audience; it is never copied — and append the hop to its\nthread. During M0, only the original note's actor may add it.\n","tags":["capability","messaging","messaging","routing"]},{"id":"cap-messaging-trace-thread","name":"Possibility Messaging: Trace a Thread","description":"Query the hop graph of a thread (ask → gap → add-to →\nresolution): which participants, at every hop — with\nverifier-recomputable {id, digest} references. Hop-0\nnotification (\"my question was answered\") is a query, not\nbespoke plumbing.\n","tags":["capability","messaging","threads","provenance"]},{"id":"cap-next-step-list-fixture-corpus","name":"Next step: List the ranking fixture corpus","description":"The produced, contract-tested fixture corpus behind the eight kinds: eleven fixtures — the path empty, single and gated-by-goal; the carousel; lens views cross-lens and pivoted; the why panel; the pivot state; situate; reroute; paths-out — each a complete rendering-contract envelope over producer-shaped inputs. Only the why panel carries numbers. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","next-step","ranking","fixtures","conformance","preview","read"]},{"id":"cap-next-step-whats-next","name":"Next step: What should I work on next?","description":"Rank a person's open, ready, top-level tasks by a lens — or a lens selection. Params: lens (unblock-max | teammate-lift | goal-path | quick-win | independent; default unblock-max — the single-lens back-compat param), lenses? (a LensId array that wins over lens when present: [] = the balanced house profile — stage/due-urgency/unblock-reach/goal/size blended the way Birdwork's Today card weighs them, a selection state, NOT a sixth lens id; one id = that lens; two or more = the blend whose score is the per-lens sums, every why-edge tagged with its contributing lens; duplicates collapse and order never changes the ranking), person (board KEY, e.g. JS/MX/NB — not an email: the doer whose actionable work is ranked; under teammate-lift the helper, not the helped), sourceScope? (github | slack | doc | google | mcp-agent | manual — filters candidates to one source's subgraph; readiness stays a full-graph fact), goalScope? (a goal id — goal-path only; narrows objectives to that goal and its key results), pivotMoveId? (re-center on that task's dependency neighborhood: ancestors + descendants + self over Depends-on, cycle-safe; candidates stay the person's ready tasks within the neighborhood; an out-of- neighborhood blocker still blocks; an unknown id yields an empty ranking, never a silent ignore), limit? (max items; omit for all ranked candidates). Returns RankedItem[] verbatim — rank + why[] (WhyEdge {family, label, contribution, ref?, lens?}) + tieBreaks[]; never a bare score without its decomposition.","tags":["capability","next-step","plan","ranking","read"]},{"id":"cap-next-step-why-priority","name":"Next step: Why is this ranked here?","description":"Full why-decomposition for one task under one lens — or a lens selection. Params: moveId (the single item to decompose), lens? (default unblock-max), lenses? (wins over lens when present: [] = the balanced house profile, two or more = the blend with per-lens-tagged edges), person?, pivotMoveId? (dependency-neighborhood re-centering, as in whats-next — a move excluded only by the pivot cut is named as such). Returns the item's WhyEdges — each additive term with family, label, contribution, optional graph ref, and its contributing lens when blended — summing exactly to the score (the sum invariant).","tags":["capability","next-step","plan","explanation","read"]},{"id":"cap-next-step-list-lenses","name":"Next step: List the ranking lenses","description":"The five LensIds with one-line semantics and the default marker — the closed vocabulary whats-next and why-priority accept as `lens` or blend through `lenses` — plus the selection rules: [] = the balanced house profile (not a sixth id), two or more ids = the blend (per-lens sums, lens-tagged why-edges), pivotMoveId = dependency-neighborhood re-centering. Constants only: no store read, trivially read-only.","tags":["capability","next-step","plan","discovery","read"]},{"id":"cap-permission-frames-define-role","name":"Permission Frames: Define Role","description":"Write a RoleFrame — a new role, or a new immutable version of an existing\none (id, name, capability tuples, inheritsFrom). Existing assignments\nkeep their pinned version; nothing is edited in place.\n","tags":["capability","permission-frames","rbac","roles","authoring"]},{"id":"cap-permission-frames-grant-access","name":"Permission Frames: Grant Access","description":"Append an AccessGrantFrame binding a subject (realm identity) to a role,\npinned to the role's current version and content hash.\n","tags":["capability","permission-frames","rbac","grants"]},{"id":"cap-permission-frames-revoke-access","name":"Permission Frames: Revoke Access","description":"Append a revocation frame for an existing grant. Frames are append-only:\nrevocation is a new fact, never a deletion, so the audit trail survives.\n","tags":["capability","permission-frames","rbac","grants","revocation"]},{"id":"cap-permission-frames-evaluate-access","name":"Permission Frames: Evaluate Access","description":"Read-only authorization decision: subject + action + resource (+ scope\ncontext) → allow/deny with a decision trace over the module's closed\nreason vocabulary. Fail-closed on unknown vocabulary, malformed frames,\ninheritance cycles, or scope mismatches.\n","tags":["capability","permission-frames","rbac","evaluation","read-only"]},{"id":"cap-permission-frames-list-roles","name":"Permission Frames: List Roles","description":"Read the RoleFrame collection: current versions, lineage, and the\ncapability tuples each role carries.\n","tags":["capability","permission-frames","rbac","roles","read-only"]},{"id":"cap-permission-frames-list-grants","name":"Permission Frames: List Grants","description":"Read the AccessGrantFrame collection: active grants, revocations, and\nthe role version each grant pins.\n","tags":["capability","permission-frames","rbac","grants","read-only","audit"]},{"id":"cap-plan-whats-next","name":"Plan: What should I work on next?","description":"Rank a person's open, ready, top-level tasks by a lens — or a lens selection. Params: lens (unblock-max | teammate-lift | goal-path | quick-win | independent; default unblock-max — the single-lens back-compat param), lenses? (a LensId array that wins over lens when present: [] = the balanced house profile — stage/due-urgency/unblock-reach/goal/size blended the way Birdwork's Today card weighs them, a selection state, NOT a sixth lens id; one id = that lens; two or more = the blend whose score is the per-lens sums, every why-edge tagged with its contributing lens; duplicates collapse and order never changes the ranking), person (board KEY, e.g. JS/MX/NB — not an email: the doer whose actionable work is ranked; under teammate-lift the helper, not the helped), sourceScope? (github | slack | doc | google | mcp-agent | manual — filters candidates to one source's subgraph; readiness stays a full-graph fact), goalScope? (a goal id — goal-path only; narrows objectives to that goal and its key results), pivotMoveId? (re-center on that task's dependency neighborhood: ancestors + descendants + self over Depends-on, cycle-safe; candidates stay the person's ready tasks within the neighborhood; an out-of- neighborhood blocker still blocks; an unknown id yields an empty ranking, never a silent ignore), limit? (max items; omit for all ranked candidates). Returns RankedItem[] verbatim — rank + why[] (WhyEdge {family, label, contribution, ref?, lens?}) + tieBreaks[]; never a bare score without its decomposition.","tags":["capability","plan","plan","ranking","read"]},{"id":"cap-plan-why-priority","name":"Plan: Why is this ranked here?","description":"Full why-decomposition for one task under one lens — or a lens selection. Params: moveId (the single item to decompose), lens? (default unblock-max), lenses? (wins over lens when present: [] = the balanced house profile, two or more = the blend with per-lens-tagged edges), person?, pivotMoveId? (dependency-neighborhood re-centering, as in whats-next — a move excluded only by the pivot cut is named as such). Returns the item's WhyEdges — each additive term with family, label, contribution, optional graph ref, and its contributing lens when blended — summing exactly to the score (the sum invariant).","tags":["capability","plan","plan","explanation","read"]},{"id":"cap-plan-list-lenses","name":"Plan: List the ranking lenses","description":"The five LensIds with one-line semantics and the default marker — the closed vocabulary whats-next and why-priority accept as `lens` or blend through `lenses` — plus the selection rules: [] = the balanced house profile (not a sixth id), two or more ids = the blend (per-lens sums, lens-tagged why-edges), pivotMoveId = dependency-neighborhood re-centering. Constants only: no store read, trivially read-only.","tags":["capability","plan","plan","discovery","read"]},{"id":"cap-possibility-admin-onboarding-ui-install-admin-onboarding-ui","name":"Possibility Administrator Onboarding UI: Install Administrator Onboarding UI","description":"Integrate a persistent, authenticated application route that reuses the base device-flow lifecycle and starts a ceremony only on explicit administrator action.","tags":["capability","possibility-admin-onboarding-ui","oauth","administrator","setup"]},{"id":"cap-possibility-admin-onboarding-ui-present-admin-onboarding-a2ui","name":"Possibility Administrator Onboarding UI: Present Administrator Onboarding with A2UI","description":"Project public grant state as A2UI v0.9 JSONL using the negotiated Possibility component catalog.","tags":["capability","possibility-admin-onboarding-ui","a2ui","oauth","setup"]},{"id":"cap-possibility-admin-onboarding-ui-advertise-admin-onboarding-agent-card","name":"Possibility Administrator Onboarding UI: Advertise Administrator Onboarding in Agent Card","description":"Create an A2A Agent Card skill fragment that points to the durable administrator page, never to a time-limited provider verification URL.","tags":["capability","possibility-admin-onboarding-ui","a2a","agent-card","setup"]},{"id":"cap-possibility-device-onboarding-begin-device-onboarding","name":"Possibility Device Flow Onboarding: Begin Device Onboarding","description":"Create a protected, role-specific RFC 8628 ceremony from discovered metadata.","tags":["capability","possibility-device-onboarding","oauth","device-flow","onboarding"]},{"id":"cap-possibility-device-onboarding-poll-device-onboarding","name":"Possibility Device Flow Onboarding: Poll Device Onboarding","description":"Safely poll one pending ceremony and persist RFC 8628 slow_down backoff.","tags":["capability","possibility-device-onboarding","oauth","device-flow","polling"]},{"id":"cap-possibility-device-onboarding-manage-device-grant","name":"Possibility Device Flow Onboarding: Manage Device Grant","description":"Refresh, replace, revoke, and clean up exactly one fenced role-specific grant.","tags":["capability","possibility-device-onboarding","oauth","refresh-rotation","revocation"]},{"id":"cap-public-storage-create-public-path","name":"Public Storage: Make a File Public at a Path","description":"Copy an already-stored file into the private serving store\n(content-addressed) and atomically activate the catalog pointer at\nthe chosen path. Re-mapping an existing path flips the pointer\natomically; suspended paths refuse re-mapping.\n","tags":["capability","public-storage","public-storage","serving"]},{"id":"cap-public-storage-list-public-paths","name":"Public Storage: List Public Paths","description":"List the possibility's public-path catalog (active and suspended\nrows) — exactly what is publicly reachable and what has been\nsuspended.\n","tags":["capability","public-storage","public-storage","catalog"]},{"id":"cap-public-storage-remove-public-path","name":"Public Storage: Remove a Public Path","description":"Flip a public path to removed (audit row retained) and garbage-collect\nthe stored object when no other live path references the same content.\nThe path immediately serves the same not-found response as one that\nnever existed.\n","tags":["capability","public-storage","public-storage","serving"]},{"id":"cap-slack-auth-connect-slack","name":"Slack Authentication: Connect Slack","description":"Store a Slack bot token for the Possibility and verify it with auth.test (returns the team/bot identity; ok:false = invalid).","tags":["capability","slack-auth","auth","slack"]},{"id":"cap-slack-auth-verify-credential","name":"Slack Authentication: Verify Slack credential","description":"Confirm the stored bot token still works via auth.test.","tags":["capability","slack-auth","auth","slack"]},{"id":"cap-slack-auth-revoke-credential","name":"Slack Authentication: Revoke Slack credential","description":"Remove the stored Slack bot token for the Possibility.","tags":["capability","slack-auth","auth","slack"]},{"id":"cap-slack-messaging-list-channels","name":"Slack Messaging: List channels","description":"conversations.list — public channels the bot can see (types, exclude_archived; cursor pagination via next_cursor).","tags":["capability","slack-messaging","slack","channels","read"]},{"id":"cap-slack-messaging-join-channel","name":"Slack Messaging: Join a channel","description":"conversations.join — the bot joins a public channel (idempotent; already_in_channel is treated as success).","tags":["capability","slack-messaging","slack","channels","write"]},{"id":"cap-slack-messaging-post-message","name":"Slack Messaging: Post a message","description":"chat.postMessage — post text or Block Kit blocks to a channel.","tags":["capability","slack-messaging","slack","messaging","write"]},{"id":"cap-slack-messaging-read-history","name":"Slack Messaging: Read channel history","description":"conversations.history — recent messages from a channel (e.g. for a transcript / extraction); auto-join the channel first if needed.","tags":["capability","slack-messaging","slack","messaging","read"]},{"id":"cap-storage-bucket-provision-bucket","name":"Possibility Storage: Provision Storage Bucket","description":"Create a MinIO bucket named `pspace-{slug}` with:\n- Standard bucket policies (private by default)\n- CORS configuration for web uploads\n- Lifecycle rules (configurable retention)\n","tags":["capability","storage-bucket","storage","provisioning","minio"]},{"id":"cap-storage-bucket-manage-access","name":"Possibility Storage: Manage Storage Access","description":"Configure realm-scoped access policies so only authenticated users\nof the Possibility's Keycloak realm can read/write the bucket.\n","tags":["capability","storage-bucket","storage","access-control","auth"]},{"id":"cap-task-card-list-fixture-corpus","name":"Task — card: List the task-card fixture corpus","description":"The produced, contract-tested fixture corpus behind the two kinds: eight fixtures across task-card and task-card-mini — populated, archived, blocked, no owner, unresolved entity, foreign state folded; mini populated and blocked — each a complete rendering-contract envelope with the host-supplied projection that produced it. What a renderer proves itself against, and what a capability browser renders to preview this block without installing it. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","task-card","task-card","fixtures","conformance","preview","read"]},{"id":"cap-task-minimal-list-fixture-corpus","name":"Task — minimal: List the task-minimal fixture corpus","description":"The produced, contract-tested fixture corpus behind the two views: eight fixtures across task-list and task-board in every lifecycle state (empty, populated, with archived, with done; foreign states folded, sizing gate on), each a complete rendering-contract envelope with its scenario input. What a renderer proves itself against, and what a capability browser renders to preview this capability without installing it. Constants only from @birdwork/specs: no store read, trivially read-only.","tags":["capability","task-minimal","task-minimal","fixtures","conformance","preview","read"]},{"id":"guides","name":"Discover developer guides","description":"Discover and fetch the filesystem-derived Possibility developer guide catalog (49 guides spanning domains like auth, storage, capabilities, identity, and best-practices). Each entry carries slug, title, domain, guide_type, time_estimate, url, and a kno:// xri suitable for graph-layer reference. Shape matches pspace-guides-mcp.guides_list and the bootstrap bundle's guides[] field. REST equivalent: GET /v1/guides. Docs: /docs/guides.","tags":["guides","docs","discovery","mcp-crosslink"],"examples":["Open a2a-caller-identity — Caller-Identity in A2A Adapters: Verification Conventions","Open adapter-hosting — Adapter Hosting — URL, Versioning, and Operational Contract for Capability Adapters","Open agent-protocols-explained — A2A, AG-UI, and A2UI: the three agent-interaction standards, explained","Open agent-secret-store — Persisting Agent Credentials — Possibility Secret Store","Open agent-transport-options — Pick the right transport for your runtime: MCP, A2A, or REST"],"entries":[{"slug":"a2a-caller-identity","title":"Caller-Identity in A2A Adapters: Verification Conventions","domain":"capabilities","guide_type":"reference","time_estimate":"20 minutes","url":"https://possibility.space/docs/guides/a2a-caller-identity","xri":"kno://guides/a2a-caller-identity"},{"slug":"adapter-hosting","title":"Adapter Hosting — URL, Versioning, and Operational Contract for Capability Adapters","domain":"capabilities","guide_type":"how-to","time_estimate":"30 minutes (reading) + ongoing operational policy","url":"https://possibility.space/docs/guides/adapter-hosting","xri":"kno://guides/adapter-hosting"},{"slug":"agent-protocols-explained","title":"A2A, AG-UI, and A2UI: the three agent-interaction standards, explained","domain":"capabilities","guide_type":"overview","time_estimate":"4 minutes","url":"https://possibility.space/docs/guides/agent-protocols-explained","xri":"kno://guides/agent-protocols-explained"},{"slug":"agent-secret-store","title":"Persisting Agent Credentials — Possibility Secret Store","domain":"auth","guide_type":"how-to","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/agent-secret-store","xri":"kno://guides/agent-secret-store"},{"slug":"agent-transport-options","title":"Pick the right transport for your runtime: MCP, A2A, or REST","domain":"capabilities","guide_type":"vendor-comparison","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/agent-transport-options","xri":"kno://guides/agent-transport-options"},{"slug":"api-error-handling","title":"API Error Handling — Recovering From a 4xx With the Remediation Envelope","domain":"fundamentals","guide_type":"how-to","time_estimate":"15 minutes","url":"https://possibility.space/docs/guides/api-error-handling","xri":"kno://guides/api-error-handling"},{"slug":"archiving-a-possibility","title":"Archiving a Possibility","domain":"collaboration","guide_type":"how-to","time_estimate":"3 minutes","url":"https://possibility.space/docs/guides/archiving-a-possibility","xri":"kno://guides/archiving-a-possibility"},{"slug":"blob-vs-entity-storage","title":"Blob vs. Entity Storage: Choosing the Right Layer","domain":"storage","guide_type":"reference","time_estimate":"15 minutes","url":"https://possibility.space/docs/guides/blob-vs-entity-storage","xri":"kno://guides/blob-vs-entity-storage"},{"slug":"branded-oidc-login","title":"Building Your Own Branded OIDC Login","domain":"auth","guide_type":"how-to","time_estimate":"30-60 minutes","url":"https://possibility.space/docs/guides/branded-oidc-login","xri":"kno://guides/branded-oidc-login"},{"slug":"branded-oidc-sample","title":"Branded OIDC Realm — Runnable TypeScript Sample","domain":"auth","guide_type":"tutorial","time_estimate":"20 minutes","url":"https://possibility.space/docs/guides/branded-oidc-sample","xri":"kno://guides/branded-oidc-sample"},{"slug":"capability-authoring-guide","title":"Capability Authoring Guide","domain":"capabilities","guide_type":"how-to","time_estimate":"30-60 minutes","url":"https://possibility.space/docs/guides/capability-authoring-guide","xri":"kno://guides/capability-authoring-guide"},{"slug":"custom-auth-domain","title":"Custom Auth Domain — Why It's Required and How to Set One Up","domain":"auth","guide_type":"how-to","time_estimate":"15-30 minutes (plus DNS propagation wait)","url":"https://possibility.space/docs/guides/custom-auth-domain","xri":"kno://guides/custom-auth-domain"},{"slug":"email-decision-matrix","title":"Email Decision Matrix: Platform Default Sender vs. Custom Sender Domain","domain":"email","guide_type":"reference","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/email-decision-matrix","xri":"kno://guides/email-decision-matrix"},{"slug":"email-dns-setup","title":"DNS Setup for Custom Email Sender Domain (Cloudflare Walkthrough)","domain":"email","guide_type":"vendor-integration","time_estimate":"25-35 minutes","url":"https://possibility.space/docs/guides/email-dns-setup","xri":"kno://guides/email-dns-setup"},{"slug":"email-troubleshooting","title":"Email Troubleshooting: Diagnosing Delivery Problems with the Mail-Tester Workflow","domain":"email","guide_type":"reference","time_estimate":"15-20 minutes","url":"https://possibility.space/docs/guides/email-troubleshooting","xri":"kno://guides/email-troubleshooting"},{"slug":"expose-content-to-agents","title":"Expose Content to Agents — robots.txt, llms.txt, and Markdown twins","domain":"best-practices","guide_type":"reference","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/expose-content-to-agents","xri":"kno://guides/expose-content-to-agents"},{"slug":"getting-started-creator-learn","title":"What a Creator Builds — A Mental Model","domain":"fundamentals","guide_type":"getting-started","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/getting-started-creator-learn","xri":"kno://guides/getting-started-creator-learn"},{"slug":"getting-started-creator-start","title":"Provision Your First Possibility","domain":"fundamentals","guide_type":"getting-started","time_estimate":"15 minutes","url":"https://possibility.space/docs/guides/getting-started-creator-start","xri":"kno://guides/getting-started-creator-start"},{"slug":"getting-started-creator-use","title":"Build Patterns for Your Possibility","domain":"fundamentals","guide_type":"getting-started","time_estimate":"20 minutes","url":"https://possibility.space/docs/guides/getting-started-creator-use","xri":"kno://guides/getting-started-creator-use"},{"slug":"getting-started-public-learn","title":"What is Possibility? — A 5-Minute Orientation","domain":"fundamentals","guide_type":"getting-started","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/getting-started-public-learn","xri":"kno://guides/getting-started-public-learn"},{"slug":"getting-started-public-start","title":"Try Possibility Without an Account","domain":"fundamentals","guide_type":"getting-started","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/getting-started-public-start","xri":"kno://guides/getting-started-public-start"},{"slug":"getting-started-public-use","title":"Use Possibility Without an Account","domain":"fundamentals","guide_type":"getting-started","time_estimate":"15 minutes","url":"https://possibility.space/docs/guides/getting-started-public-use","xri":"kno://guides/getting-started-public-use"},{"slug":"getting-started-with-auth","title":"Getting Started with Auth","domain":"auth","guide_type":"overview","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/getting-started-with-auth","xri":"kno://guides/getting-started-with-auth"},{"slug":"getting-started-with-capabilities","title":"Getting Started with Capabilities","domain":"capabilities","guide_type":"overview","time_estimate":"12 minutes","url":"https://possibility.space/docs/guides/getting-started-with-capabilities","xri":"kno://guides/getting-started-with-capabilities"},{"slug":"getting-started-with-collaboration","title":"Getting Started with Collaboration","domain":"collaboration","guide_type":"overview","time_estimate":"8 minutes","url":"https://possibility.space/docs/guides/getting-started-with-collaboration","xri":"kno://guides/getting-started-with-collaboration"},{"slug":"getting-started-with-email","title":"Getting Started with Email","domain":"email","guide_type":"overview","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/getting-started-with-email","xri":"kno://guides/getting-started-with-email"},{"slug":"headless-agent-auth","title":"Authenticate as a headless agent (CI, sandboxed runtime, no human in the loop)","domain":"capabilities","guide_type":"how-to","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/headless-agent-auth","xri":"kno://guides/headless-agent-auth"},{"slug":"inviting-members","title":"Inviting Members to a Possibility","domain":"collaboration","guide_type":"how-to","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/inviting-members","xri":"kno://guides/inviting-members"},{"slug":"joining-a-possibility","title":"Joining a Possibility","domain":"collaboration","guide_type":"how-to","time_estimate":"3 minutes","url":"https://possibility.space/docs/guides/joining-a-possibility","xri":"kno://guides/joining-a-possibility"},{"slug":"kno-first-development","title":".kno-First Development: Patterns, Schema Discipline, and Drift-Guards","domain":"best-practices","guide_type":"reference","time_estimate":"18 minutes","url":"https://possibility.space/docs/guides/kno-first-development","xri":"kno://guides/kno-first-development"},{"slug":"leaving-a-possibility","title":"Leaving a Possibility","domain":"collaboration","guide_type":"how-to","time_estimate":"3 minutes","url":"https://possibility.space/docs/guides/leaving-a-possibility","xri":"kno://guides/leaving-a-possibility"},{"slug":"make-your-app-a-capability","title":"Make Your App a Capability","domain":"capabilities","guide_type":"how-to","time_estimate":"2-4 hours","url":"https://possibility.space/docs/guides/make-your-app-a-capability","xri":"kno://guides/make-your-app-a-capability"},{"slug":"managing-members","title":"Managing Members of a Possibility","domain":"collaboration","guide_type":"how-to","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/managing-members","xri":"kno://guides/managing-members"},{"slug":"mcp-runtime-debugging","title":"Debug an MCP client that doesn't surface Possibility's tools","domain":"capabilities","guide_type":"vendor-comparison","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/mcp-runtime-debugging","xri":"kno://guides/mcp-runtime-debugging"},{"slug":"mcp-sse-connection","title":"Connecting to MCP — Streamable HTTP Cookbook","domain":"capabilities","guide_type":"how-to","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/mcp-sse-connection","xri":"kno://guides/mcp-sse-connection"},{"slug":"multi-possibility-federated","title":"Multi-Possibility & Federated Patterns","domain":"best-practices","guide_type":"reference","time_estimate":"20 minutes","url":"https://possibility.space/docs/guides/multi-possibility-federated","xri":"kno://guides/multi-possibility-federated"},{"slug":"note-fabric-integration","title":"Leave and read notes on the fabric as your own principal","domain":"capabilities","guide_type":"how-to","time_estimate":"20 minutes","url":"https://possibility.space/docs/guides/note-fabric-integration","xri":"kno://guides/note-fabric-integration"},{"slug":"notices","title":"Notices and Status Feeds for Tenant Operators","domain":"fundamentals","guide_type":"how-to","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/notices","xri":"kno://guides/notices"},{"slug":"owner-attestation-jwt","title":"Owner Attestation JWTs: Offline-Verifiable Ownership Proofs for Adapters","domain":"auth","guide_type":"how-to","time_estimate":"15 minutes","url":"https://possibility.space/docs/guides/owner-attestation-jwt","xri":"kno://guides/owner-attestation-jwt"},{"slug":"persona-attribution","title":"Reading Persona-Attributed Activity","domain":"auth","guide_type":"how-to","time_estimate":"15-20 minutes","url":"https://possibility.space/docs/guides/persona-attribution","xri":"kno://guides/persona-attribution"},{"slug":"stateless-ephemeral-caller-onboarding","title":"Stateless Ephemeral Caller Onboarding: CI Runner Profile","domain":"capabilities","guide_type":"how-to","time_estimate":"30 minutes","url":"https://possibility.space/docs/guides/stateless-ephemeral-caller-onboarding","xri":"kno://guides/stateless-ephemeral-caller-onboarding"},{"slug":"storage-access-control","title":"Storage Access Control: Platform Isolation vs. Tenant Authorization","domain":"storage","guide_type":"reference","time_estimate":"12 minutes","url":"https://possibility.space/docs/guides/storage-access-control","xri":"kno://guides/storage-access-control"},{"slug":"storage-files-basics","title":"Storage Files Basics: Runnable TypeScript Samples","domain":"storage","guide_type":"how-to","time_estimate":"20 minutes","url":"https://possibility.space/docs/guides/storage-files-basics","xri":"kno://guides/storage-files-basics"},{"slug":"storage-options-overview","title":"Storage Options Overview","domain":"storage","guide_type":"overview","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/storage-options-overview","xri":"kno://guides/storage-options-overview"},{"slug":"storage-public-paths","title":"Public Storage: Make a Stored File Public","domain":"storage","guide_type":"how-to","time_estimate":"15 minutes","url":"https://possibility.space/docs/guides/storage-public-paths","xri":"kno://guides/storage-public-paths"},{"slug":"tenant-data-events","title":"Tenant Data Events: Live Mutation Streams","domain":"data","guide_type":"reference","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/tenant-data-events","xri":"kno://guides/tenant-data-events"},{"slug":"tenant-data-row-acl","title":"Tenant Data: Per-Row ACLs","domain":"data","guide_type":"reference","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/tenant-data-row-acl","xri":"kno://guides/tenant-data-row-acl"},{"slug":"use-pspace-mcp-in-any-client","title":"Configure Possibility's MCP Registry in any compliant client","domain":"capabilities","guide_type":"vendor-comparison","time_estimate":"10 minutes","url":"https://possibility.space/docs/guides/use-pspace-mcp-in-any-client","xri":"kno://guides/use-pspace-mcp-in-any-client"},{"slug":"use-pspace-mcp-in-github-copilot","title":"Configure Possibility's MCP Registry in GitHub Copilot","domain":"capabilities","guide_type":"vendor-integration","time_estimate":"5 minutes","url":"https://possibility.space/docs/guides/use-pspace-mcp-in-github-copilot","xri":"kno://guides/use-pspace-mcp-in-github-copilot"}]},{"id":"mcp-registry","name":"MCP Registry","description":"MCP server catalog at /v0.1/servers conforming to the upstream MCP Registry spec. Conforms to upstream spec 2025-12-11 (https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json). Endpoint: https://api.possibility.space/v0.1/servers.","tags":["registry","discovery","mcp-registry","github-copilot-compatible"],"url":"https://api.possibility.space/v0.1/servers","spec_url":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","spec_version":"2025-12-11","compatibility":{"github_copilot_compatible":true}},{"id":"pspace.skills.rfcs","name":"Discover RFCs","description":"Discover and fetch the RFCs catalog (rfcs). Three tools — rfcs_list, rfcs_get_by_slug, rfcs_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/rfcs. Docs: /docs/rfcs.","tags":["collection","rfcs","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/rfcs"},{"type":"rest","url":"https://api.possibility.space/v1/rfcs"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://rfcs"}]},{"id":"pspace.skills.apis","name":"Discover APIs","description":"Discover and fetch the APIs catalog (apis). Three tools — apis_list, apis_get_by_slug, apis_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/apis. Docs: /docs/api.","tags":["collection","apis","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/apis"},{"type":"rest","url":"https://api.possibility.space/v1/apis"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://apis"}]},{"id":"pspace.skills.mcp-servers","name":"Discover MCP Servers","description":"Discover and fetch the MCP Servers catalog (mcp-servers). Three tools — mcp-servers_list, mcp-servers_get_by_slug, mcp-servers_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/mcp-servers. Docs: /docs/mcp.","tags":["collection","mcp-servers","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/mcp-servers"},{"type":"rest","url":"https://api.possibility.space/v1/mcp-servers"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://mcp-servers"}]},{"id":"pspace.skills.examples","name":"Discover Examples","description":"Discover and fetch the Examples catalog (examples). Three tools — examples_list, examples_get_by_slug, examples_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/examples. Docs: /docs/examples.","tags":["collection","examples","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/examples"},{"type":"rest","url":"https://api.possibility.space/v1/examples"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://examples"}]},{"id":"pspace.skills.quickstarts","name":"Discover Quickstarts","description":"Discover and fetch the Quickstarts catalog (quickstarts). Three tools — quickstarts_list, quickstarts_get_by_slug, quickstarts_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/quickstarts. Docs: /docs/quickstarts.","tags":["collection","quickstarts","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/quickstarts"},{"type":"rest","url":"https://api.possibility.space/v1/quickstarts"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://quickstarts"}]},{"id":"pspace.skills.capabilities","name":"Discover Capabilities","description":"Discover and fetch the Capabilities catalog (capabilities). Three tools — capabilities_list, capabilities_get_by_slug, capabilities_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/capabilities. Docs: /docs/capabilities.","tags":["collection","capabilities","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/capabilities"},{"type":"rest","url":"https://api.possibility.space/v1/capabilities"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://capabilities"}]},{"id":"pspace.skills.knowledge-base","name":"Discover Knowledge Base","description":"Discover and fetch the Knowledge Base catalog (knowledge-base). Three tools — knowledge-base_list, knowledge-base_get_by_slug, knowledge-base_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/knowledge-base. Docs: /docs/knowledge-base.","tags":["collection","knowledge-base","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/knowledge-base"},{"type":"rest","url":"https://api.possibility.space/v1/knowledge-base"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://knowledge-base"}]},{"id":"pspace.skills.registries","name":"Discover Registries","description":"Discover and fetch the Registries catalog (registries). Three tools — registries_list, registries_get_by_slug, registries_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/registries. Docs: /docs/registries.","tags":["collection","registries","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/registries"},{"type":"rest","url":"https://api.possibility.space/v1/registries"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://registries"}]},{"id":"pspace.skills.reference-bundles","name":"Discover Reference Bundles","description":"Discover and fetch the Reference Bundles catalog (reference-bundles). Three tools — reference-bundles_list, reference-bundles_get_by_slug, reference-bundles_search — back the same projection used by REST and llms.txt; envelopes are byte-identical. REST equivalent: GET /v1/reference-bundles. Docs: /docs/reference-bundles.","tags":["collection","reference-bundles","discovery","mcp-crosslink"],"resources":[{"type":"mcp","url":"https://api.possibility.space/mcp/reference-bundles"},{"type":"rest","url":"https://api.possibility.space/v1/reference-bundles"},{"type":"corpus","url":"https://api.possibility.space/llms.txt"},{"type":"xri","url":"pspace://reference-bundles"}]}],"integrationManifest":"https://api.possibility.space/.well-known/integration","x-possibility":{"platformVersion":"0.1.0","entityTypes":["user","organization","possibility","service-config","role","connector"],"supportedSchemas":["service-config@0.3.0","agent-blueprint@0.2.0","api-spec@0.1.0"],"integrationManifest":"https://api.possibility.space/.well-known/integration","mcpEndpoint":"https://api.possibility.space/mcp"}}