{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T16:59:48.520Z","url":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server","markdownUrl":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server.md","server":{"slug":"david-steel-otp","name":"OTP","registryName":"io.github.david-steel/otp","description":"Put AI agents on your org chart: seats, KPIs, to-dos, meetings and logged work, next to the people.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"otp-mcp-server","type":"npm","identifier":"otp-mcp-server","withdrawn":false,"url":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server","version":"0.5.3","transport":"stdio","scoredAt":"2026-11-05T04:24:29.263Z"},"score":{"total":62,"tier":"medium","status":"scored","weekDelta":null,"history":[{"date":"2026-11-05","total":62},{"date":"2026-11-04","total":62},{"date":"2026-11-03","total":62},{"date":"2026-11-02","total":62},{"date":"2026-11-01","total":62},{"date":"2026-10-31","total":62},{"date":"2026-10-30","total":47}]},"categories":[{"name":"Supply Chain Security","score":98,"verdict":"partial","reasons":["No malware found by supply-chain analysis.","No known CVEs affecting this package version or its production dependencies.","No install/post-install scripts declared.","30 of 92 dependencies flagged as unhealthy."],"codes":[{"code":"supplychain.malware_clean","args":{}},{"code":"cve.none","args":{}},{"code":"installscript.none","args":{}},{"code":"dephealth.assessed","args":{"deps":"92","unhealthy":"30"}}]},{"name":"Provenance & Transparency","score":19,"verdict":"fail","reasons":["Repository check failed: no source repository is declared.","Provenance check failed: no build-provenance attestation is published.","Clear OSI-approved license (MIT).","Actively maintained (last published 5 days ago).","Security-disclosure policy not yet verified: we couldn't inspect the source repository."],"codes":[{"code":"provenance.repo_none","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"5"}},{"code":"disclosure.repo_inconclusive","args":{"reason":"no_repo_declared"}}]},{"name":"Schema Quality & AI Usability","score":68,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 8900 tokens (~134/item across 66 items; 66 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"134","items":"66","tools":"66","tokens":"8900","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":95,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","85% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"85"}}]},{"name":"Tool Safety","score":75,"verdict":"fail","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; \"publish_oos\" implies \"publish\" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.","An AI judge read all 66 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_undeclared","args":{"pct":"0","tool":"publish_oos","verb":"publish","declared":"none","annotated":"0","destructive":"2"}},{"code":"toolsafety.manipulation_clean","args":{"units":"66","judged":"66"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28."],"codes":[{"code":"protocol.supported","args":{"latest":"2026-07-28","version":"2025-11-25"}}]}],"inconclusive":["Security-disclosure policy not yet verified: we couldn't inspect the source repository.","Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"malware":[],"components":[{"slug":"api-mcp","type":"remote","identifier":"https://orgtp.com/api/mcp","withdrawn":false,"score":38,"current":false,"url":"https://verifymcp.io/servers/david-steel-otp/api-mcp","markdownUrl":"https://verifymcp.io/servers/david-steel-otp/api-mcp.md"},{"slug":"api-mcp-public","type":"remote","identifier":"https://orgtp.com/api/mcp/public","withdrawn":false,"score":75,"current":false,"url":"https://verifymcp.io/servers/david-steel-otp/api-mcp-public","markdownUrl":"https://verifymcp.io/servers/david-steel-otp/api-mcp-public.md"},{"slug":"otp-mcp-server","type":"npm","identifier":"otp-mcp-server","withdrawn":false,"score":62,"current":true,"url":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server","markdownUrl":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server.md"}],"facts":[{"label":"Registry","value":"npm"},{"label":"Package","value":"otp-mcp-server"},{"label":"Version","value":"0.5.3"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"register_agent","title":null,"description":"Put YOURSELF on this organization's OTP org chart. Call this once, when a human gives you an OTP connection code and asks you to connect. Read your own system prompt / CLAUDE.md and describe yourself honestly: your name, your role, what you own, what you explicitly do not own, and up to 3 KPIs you should be measured on. OTP creates your seat, seeds your KPIs, and binds this connection to you, so from then on OTP knows which agent is calling. If the humans ALREADY drew your seat on the chart and gave you its id, call claim_seat with that id instead -- register_agent would create a duplicate. Safe to retry: if you are already registered it just tells you who you are. Do not invent a KPI you have no way to move.","inputs":[{"name":"doesNotOwn","type":"string","required":false,"description":"What is explicitly NOT yours, so the chart has no overlap. E.g. 'Client comms, strategic decisions'"},{"name":"kpis","type":"array","required":false,"description":"Up to 3 KPIs you should be judged on. Omit rather than invent."},{"name":"name","type":"string","required":true,"description":"What you are called. E.g. 'Forecaster', 'Dash'"},{"name":"owns","type":"string","required":false,"description":"What you are accountable for. E.g. 'Weekly revenue forecast, pipeline coverage, spend pacing'"},{"name":"reportsTo","type":"string","required":false,"description":"The chart seat you report to (e.g. 'HUM_NATEFOSS'). Use it ONLY if the human's connection code gave you one; otherwise leave it out and OTP reports you to whoever enrolled you."},{"name":"role","type":"string","required":false,"description":"One line on what you do. E.g. 'Reads the numbers and calls the trend before it lands'"},{"name":"systemPrompt","type":"string","required":false,"description":"Your full system prompt / CLAUDE.md, verbatim, if you can read it. Stored as your brain so you survive being rebuilt elsewhere."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":392},{"name":"claim_seat","title":null,"description":"Take a seat that is ALREADY drawn on this organization's org chart. Use claim_seat when the humans drew your seat before you connected -- they will give you its exact id (e.g. 'AGT_RADAR') in the connection code or by name; use register_agent only when you have NO seat on the chart yet (it creates a new one, and would create a duplicate here). Pass external_id exactly as given. Optionally add, honestly from your own system prompt / CLAUDE.md: your role, what you own, what you explicitly do not own, and up to 3 KPIs. OTP binds this connection to that seat, so from then on OTP knows which agent is calling. Safe to retry: if this connection already holds the seat it just says so.","inputs":[{"name":"doesNotOwn","type":"string","required":false,"description":"What is explicitly NOT yours, so the chart has no overlap. E.g. 'Client comms, strategic decisions'"},{"name":"external_id","type":"string","required":true,"description":"The chart seat to claim, exactly as the human gave it. E.g. 'AGT_RADAR'"},{"name":"kpis","type":"array","required":false,"description":"Up to 3 KPIs you should be judged on. Omit rather than invent."},{"name":"owns","type":"string","required":false,"description":"What you are accountable for. E.g. 'Weekly revenue forecast, pipeline coverage, spend pacing'"},{"name":"role","type":"string","required":false,"description":"One line on what you do. E.g. 'Reads the numbers and calls the trend before it lands'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":309},{"name":"get_my_seat","title":null,"description":"Who YOU are on this organization's chart: your seat id, name, and role, who you escalate to, your immediate colleagues (peers under the same manager, names and types only), and the KPIs you are measured on. Resolved from this connection's bound identity, never from arguments, so it always answers about the agent calling. If it says this key is not bound to a seat, you are on an org-wide connection: call register_agent to take a seat, then this same connection is your identity.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"log_work","title":null,"description":"Report a piece of work you have COMPLETED, so it shows on your chart tile and in the organization's activity. One call per completed piece of work, after it is done -- never for work you only planned or started. summary says what you did, in one or two sentences. Requires this connection to hold a seat (register_agent first); if it refuses with SEAT_NOT_BOUND, register and try again. Do not log the same work twice, and do not invent cost_cents you cannot substantiate.","inputs":[{"name":"category","type":"string","required":false,"description":"Optional bucket for the work, e.g. 'reporting', 'outreach', 'triage'"},{"name":"cost_cents","type":"integer","required":false,"description":"What the work cost in cents (tokens/API spend), if you know it. Omit for 0; never estimate upward."},{"name":"summary","type":"string","required":true,"description":"What you did, past tense, <= 500 chars. E.g. 'Triaged 14 inbound emails, drafted 3 replies for approval'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":208},{"name":"browse_oos","title":null,"description":"Browse published Organizational Operating Systems on OTP. Filter by industry, org size, template type, or quality tier. Returns a list of published OOS files with org metadata.","inputs":[{"name":"industry","type":"string","required":false,"description":"Filter by industry (e.g. 'digital_marketing', 'saas', 'healthcare')"},{"name":"limit","type":"number","required":false,"description":"Results per page (default 20, max 100)"},{"name":"page","type":"number","required":false,"description":"Page number (default 1)"},{"name":"size","type":"string","required":false,"description":"Filter by organization size"},{"name":"sort","type":"string","required":false,"description":"Sort order: newest (default), claims count, or quality tier"},{"name":"template","type":"string","required":false,"description":"Filter by OOS template type"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":144},{"name":"search_claims","title":null,"description":"Search across all published OOS claims on OTP. Use natural language queries to find coordination patterns, failure modes, agent rules, and operational intelligence from other organizations.","inputs":[{"name":"confidence","type":"string","required":false,"description":"Filter by confidence level"},{"name":"evidence","type":"string","required":false,"description":"Filter by evidence type"},{"name":"industry","type":"string","required":false,"description":"Filter by industry"},{"name":"limit","type":"number","required":false,"description":"Results per page (max 100)"},{"name":"page","type":"number","required":false,"description":"Page number"},{"name":"q","type":"string","required":true,"description":"Search query (e.g. 'shared state file coordination', 'agent escalation failure')"},{"name":"template","type":"string","required":false,"description":"Filter by template"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":129},{"name":"get_oos","title":null,"description":"Get a specific published OOS file by its ID, including organization metadata and file details.","inputs":[{"name":"id","type":"string","required":true,"description":"The OOS file ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":39},{"name":"get_claims","title":null,"description":"Get all claims from a specific OOS file. Each claim contains a rule, reasoning (why), failure mode, confidence level, and evidence type. Filter by section, confidence, or evidence type.","inputs":[{"name":"confidence","type":"string","required":false,"description":"Filter by confidence level"},{"name":"evidence","type":"string","required":false,"description":"Filter by evidence type"},{"name":"oos_id","type":"string","required":true,"description":"The OOS file ID to get claims from"},{"name":"section","type":"string","required":false,"description":"Filter by section (e.g. 'core_operating_rules', 'failure_patterns', 'coordination_patterns', 'operational_heuristics', 'human_ai_boundary_conditions')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":130},{"name":"compare_oos","title":null,"description":"Compare two published OOS files side-by-side. Returns claims unique to each, similar claims, and duplicates. Great for learning what other organizations do differently.","inputs":[{"name":"oos_id_a","type":"string","required":true,"description":"First OOS file ID (typically yours)"},{"name":"oos_id_b","type":"string","required":true,"description":"Second OOS file ID (the one to compare against)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":79},{"name":"search_intelligence","title":null,"description":"Deep search across the OTP intelligence base with faceted filtering. Returns claims grouped by section, industry, confidence, and evidence type. More powerful than search_claims.","inputs":[{"name":"confidence","type":"string","required":false,"description":"Filter by confidence"},{"name":"evidence","type":"string","required":false,"description":"Filter by evidence type"},{"name":"industry","type":"string","required":false,"description":"Filter by industry"},{"name":"limit","type":"number","required":false,"description":"Results per page"},{"name":"min_quality","type":"string","required":false,"description":"Minimum publisher quality tier"},{"name":"page","type":"number","required":false,"description":"Page number"},{"name":"q","type":"string","required":false,"description":"Search query"},{"name":"section","type":"string","required":false,"description":"Filter by claim section"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":124},{"name":"get_publishers","title":null,"description":"Browse organizations that have published OOS files on OTP. See their quality tier, badge, industry, claim count, and publication history.","inputs":[{"name":"industry","type":"string","required":false,"description":"Filter by industry"},{"name":"limit","type":"number","required":false,"description":"Results per page"},{"name":"min_quality","type":"string","required":false,"description":"Minimum quality tier"},{"name":"page","type":"number","required":false,"description":"Page number"},{"name":"template","type":"string","required":false,"description":"Filter by template type"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":87},{"name":"get_org","title":null,"description":"Get a specific organization's public profile on OTP, including their published OOS files, quality tier, badge, and stats.","inputs":[{"name":"org_id","type":"string","required":true,"description":"The organization ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"get_patterns","title":null,"description":"Discover coordination patterns that appear across multiple organizations. Shows which agent configurations, authority structures, and workflow patterns are most common.","inputs":[{"name":"industry","type":"string","required":false,"description":"Filter patterns by industry"},{"name":"min_orgs","type":"number","required":false,"description":"Minimum number of organizations a pattern must appear in (default 2)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":65},{"name":"get_sections","title":null,"description":"List all claim sections available on OTP with counts. Sections include: core_operating_rules, agent_roles_and_authority, coordination_patterns, operational_heuristics, failure_patterns, human_ai_boundary_conditions.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":48},{"name":"publish_oos","title":null,"description":"Publish an Organizational Operating System file to OTP. Requires an API key. The OOS content should be in the standard OOS markdown format with YAML frontmatter and structured claims.","inputs":[{"name":"raw_content","type":"string","required":true,"description":"The full OOS file content in markdown format with YAML frontmatter"},{"name":"template","type":"string","required":true,"description":"The OOS template type"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":77},{"name":"my_dashboard","title":null,"description":"Get your organization's OTP publisher dashboard. Shows published files, total claims, quality tier, connected orgs, and recent activity. Requires API key.","inputs":[{"name":"oos_id","type":"string","required":true,"description":"Your latest OOS file ID"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":52},{"name":"discover_intelligence","title":null,"description":"Run the OTP Scout to discover relevant coordination intelligence from other organizations. Analyzes gaps in your OOS and finds high-quality claims you might want to adopt. Requires API key.","inputs":[{"name":"limit","type":"number","required":false,"description":"Maximum number of recommendations to discover (default 20)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":62},{"name":"get_inbox","title":null,"description":"View your intelligence inbox -- recommendations discovered by the Scout. Filter by status (pending, accepted, rejected, adapted) or section. Requires API key.","inputs":[{"name":"limit","type":"number","required":false,"description":"Results per page (default 20, max 100)"},{"name":"offset","type":"number","required":false,"description":"Offset for pagination (default 0)"},{"name":"section","type":"string","required":false,"description":"Filter by claim section (e.g. 'failure_patterns', 'coordination_patterns')"},{"name":"status","type":"string","required":false,"description":"Filter by recommendation status (default: pending)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":109},{"name":"review_recommendation","title":null,"description":"Review a recommendation from your inbox. Accept to adopt as-is, reject to dismiss, or adapt to modify the claim for your organization's context. Requires API key.","inputs":[{"name":"action","type":"string","required":true,"description":"Action to take: accept, reject, or adapt"},{"name":"adapted_rule","type":"string","required":false,"description":"Modified rule text (required when action is 'adapt')"},{"name":"adapted_why","type":"string","required":false,"description":"Modified reasoning text (optional when action is 'adapt')"},{"name":"id","type":"string","required":true,"description":"The recommendation ID to review"},{"name":"notes","type":"string","required":false,"description":"Optional review notes explaining your decision"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":121},{"name":"get_inbox_stats","title":null,"description":"Get a summary of your intelligence inbox -- how many recommendations are pending, accepted, rejected, and adapted. Shows top sections and average relevance score. Requires API key.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"get_best_practices","title":null,"description":"Browse OTP's best practices library -- 1,500+ actionable rules from 9 publishers (Google, AWS, Deloitte, Accenture, etc.). Search by keyword, filter by category or publisher. Each practice is a prescriptive rule with why and failure mode. Requires API key.","inputs":[{"name":"category","type":"string","required":false,"description":"Filter by category (e.g. 'Machine Learning', 'MLOps', 'AI Strategy', 'Prompt Engineering', 'AI Governance')"},{"name":"limit","type":"number","required":false,"description":"Results per page (default 50, max 200)"},{"name":"page","type":"number","required":false,"description":"Page number (default 1)"},{"name":"publisher","type":"string","required":false,"description":"Filter by publisher profile ID"},{"name":"q","type":"string","required":false,"description":"Search query (e.g. 'prompt engineering', 'data governance', 'agent coordination')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":169},{"name":"get_my_rules","title":null,"description":"Get your organization's operational rules from OTP -- your published OOS claims PLUS matched best practices from the library. Returns rules in a format agents can directly use for coordination. This is the bridge between OTP and your agent army. Requires API key.","inputs":[{"name":"include_best_practices","type":"boolean","required":false,"description":"Include matched best practices alongside OOS claims (default true)"},{"name":"min_confidence","type":"string","required":false,"description":"Minimum confidence level (default: all)"},{"name":"section","type":"string","required":false,"description":"Filter by section (e.g. 'core_operating_rules', 'coordination_patterns')"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":119},{"name":"export_rules_markdown","title":null,"description":"Export your OTP rules (OOS claims + matched best practices) to a local markdown file that agents can read at startup. This bridges OTP intelligence into your local agent army. Requires API key.","inputs":[{"name":"include_best_practices","type":"boolean","required":false,"description":"Include matched best practices (default true)"},{"name":"output_path","type":"string","required":false,"description":"File path to write rules to (default: ~/.claude/otp-rules.md)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":92},{"name":"capture_learning","title":null,"description":"Capture an operational learning when an agent fails or you discover a better approach. This is the core OTP feedback loop: agent fails → you correct → correction becomes coordination intelligence → all agents improve. The learning is saved as a claim in your draft OOS and will be available via get_my_rules.","inputs":[{"name":"agent","type":"string","required":false,"description":"Which agent failed. E.g. 'Dash', 'Pepper', 'Dirk'"},{"name":"section","type":"string","required":false,"description":"Which OOS section this belongs in (auto-detected if not specified)"},{"name":"source_url","type":"string","required":false,"description":"URL to a better approach, repo, or reference. E.g. 'https://github.com/user/better-meta-analysis'"},{"name":"what_failed","type":"string","required":true,"description":"What went wrong. E.g. 'Dash gave bad Meta Ads analysis -- used wrong date range and missed spend anomalies'"},{"name":"what_to_do","type":"string","required":true,"description":"The rule/fix. E.g. 'Always validate date ranges against the campaign's actual active period before running spend analysis'"},{"name":"why","type":"string","required":false,"description":"Why this matters. E.g. 'Without date validation, the analysis includes pre-launch zeros that skew averages down'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":237},{"name":"get_network_learnings","title":null,"description":"See what other organizations on the OTP network have learned recently. Shows operational corrections and coordination discoveries from other agent teams. This is how your agents learn from the entire network, not just your own experience.","inputs":[{"name":"agent","type":"string","required":false,"description":"Filter by agent name to see learnings relevant to a specific agent"},{"name":"limit","type":"number","required":false,"description":"Max results (default 20)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":83},{"name":"submit_ticket","title":null,"description":"Report a bug, request a feature, or ask a question about the OTP platform. Creates a ticket that the OTP team (or their agent) will review and resolve.","inputs":[{"name":"category","type":"string","required":false,"description":"Ticket category (default: bug)"},{"name":"description","type":"string","required":true,"description":"Detailed description: steps to reproduce, expected behavior, actual behavior"},{"name":"priority","type":"string","required":false,"description":"Priority level (default: medium)"},{"name":"reporter_email","type":"string","required":false,"description":"Email for follow-up (optional)"},{"name":"title","type":"string","required":true,"description":"Brief description of the issue"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":113},{"name":"list_connections","title":null,"description":"List the outside systems this organization has connected (Slack, Gmail, Linear, spreadsheets and so on) with the live state of each: active, still authorizing, failed, or disconnected. Each entry carries a plain explanation of what went wrong when something is not working. Use this whenever someone asks what is connected, why a connection is not working, or what you can currently reach. This is the source of truth about connections -- do not infer them from which tools you happen to have.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":106},{"name":"search_integrations","title":null,"description":"Search the catalog of outside systems that can be connected to OTP (over 1000 apps via Composio). Use when someone asks whether a tool can be connected, or what is available. `connectable: true` means it can be connected today from Settings, Integrations; `connectable: false` means the catalog carries it but this deployment has no auth configured for it yet, so it cannot be connected without OTP adding it. `personal: true` means it connects as an individual rather than for the whole organization.","inputs":[{"name":"search","type":"string","required":true,"description":"What to look for, e.g. 'linear', 'calendar', 'analytics'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":139},{"name":"composio_docs","title":null,"description":"Search Composio's official documentation (docs.composio.dev) for how a connection works: required scopes, authentication, available actions, limits, provider-specific setup. Use this instead of answering from memory when someone asks how to use or set up a connection. Every result carries the source URL -- cite it.","inputs":[{"name":"limit","type":"number","required":false,"description":"How many doc pages to return (1-10, default 5)"},{"name":"q","type":"string","required":true,"description":"What to look up, e.g. 'slack scopes', 'connect google calendar', 'trigger webhooks'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":122},{"name":"list_tickets","title":null,"description":"List tickets on the OTP platform. Filter by status (open, in_progress, resolved, closed) or category (bug, feature, question, other).","inputs":[{"name":"category","type":"string","required":false,"description":"Filter by category"},{"name":"limit","type":"number","required":false,"description":"Results per page (max 100)"},{"name":"status","type":"string","required":false,"description":"Filter by status"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"update_ticket","title":null,"description":"Update a ticket on OTP. Use to resolve issues, add agent notes, or change status. Requires API key.","inputs":[{"name":"agent_notes","type":"string","required":false,"description":"Internal notes from the fixing agent"},{"name":"id","type":"string","required":true,"description":"The ticket ID to update"},{"name":"priority","type":"string","required":false,"description":"New priority"},{"name":"resolution","type":"string","required":false,"description":"Resolution description (what was done to fix it)"},{"name":"status","type":"string","required":false,"description":"New status"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":91},{"name":"list_my_kpis","title":null,"description":"List KPIs (scorecard measurables) on the org chart, filterable by owner, each with its goal and its latest recorded value, the period that value is for, and whether it meets the goal. Use this to see what an agent or human is being measured against, which KPIs are off goal, and to find a KPI's id or exact title before pushing a value with update_kpi. latest_value is null when nothing was recorded recently; meets_goal is null when there is no value or no goal.","inputs":[{"name":"include_values","type":"boolean","required":false,"description":"Attach latest_value, latest_period_start and meets_goal. Default true; pass false for the bare list."},{"name":"owner_entity_type","type":"string","required":false,"description":"Filter by entity type."},{"name":"owner_external_id","type":"string","required":false,"description":"Filter to one owner's KPIs. E.g. 'AGT_DIRK' for the Dirk agent, 'HUM_DAVIDSTEEL' for David."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":199},{"name":"update_kpi","title":null,"description":"Push a KPI value (the actual measured number for a period). This is how an agent reports 'this is what I did this week / this month' to its scorecard. Looks up the KPI by title under a given owner, then writes the value. periodStart defaults to the start of the current period for the KPI's time grain (e.g. start of this week for a weekly KPI).","inputs":[{"name":"notes","type":"string","required":false,"description":"Optional context. E.g. 'after 12pm send wave'."},{"name":"owner_external_id","type":"string","required":true,"description":"The agent or human external id that owns the KPI. E.g. 'AGT_DIRK'."},{"name":"period_start","type":"string","required":false,"description":"ISO date for the period start (YYYY-MM-DD). If omitted, computes start of current period from the KPI's time grain."},{"name":"title","type":"string","required":true,"description":"The KPI title (case-insensitive match against the KPI's stored title). E.g. 'Cold emails sent'."},{"name":"value","type":"number","required":true,"description":"The actual measured value for the period. E.g. 30."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":220},{"name":"list_rocks","title":null,"description":"List quarterly rocks for the authenticated organization. Filter by quarter (e.g. '2026-Q2') or owner_external_id. Each rock carries status: on_track, off_track, completed or archived. Read status, not the on_track flag: a completed rock can still carry on_track false from before it was finished. Archived rocks are left out unless include_archived is true.","inputs":[{"name":"include_archived","type":"boolean","required":false,"description":"Also return archived rocks. Default false."},{"name":"on_track","type":"boolean","required":false,"description":"Only open rocks that are on track (true) or off track (false); completed and archived rocks are excluded"},{"name":"owner_external_id","type":"string","required":false,"description":"Filter to one owner"},{"name":"quarter","type":"string","required":false,"description":"Quarter filter, e.g. '2026-Q2'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":163},{"name":"add_rock","title":null,"description":"Create a quarterly rock: the 90-day priority a seat commits to. Requires owner, title, quarter, and due date.","inputs":[{"name":"description","type":"string","required":false,"description":null},{"name":"due_date","type":"string","required":true,"description":"ISO 8601 datetime, e.g. '2026-06-30T23:59:59Z'"},{"name":"on_track","type":"boolean","required":false,"description":"Defaults to true at creation"},{"name":"owner_entity_type","type":"string","required":true,"description":"Who owns this rock"},{"name":"owner_external_id","type":"string","required":true,"description":"Owner identifier (e.g. 'dsteel', 'dirk')"},{"name":"owner_name","type":"string","required":false,"description":"Display name for the owner"},{"name":"quarter","type":"string","required":true,"description":"e.g. '2026-Q2'"},{"name":"status_note","type":"string","required":false,"description":"Initial status note"},{"name":"title","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":167},{"name":"update_rock","title":null,"description":"Update a rock's status (on_track flag, status note, completion). Used during the weekly Delta Meeting rock review.","inputs":[{"name":"completed","type":"boolean","required":false,"description":"Mark rock complete"},{"name":"on_track","type":"boolean","required":false,"description":null},{"name":"rock_id","type":"string","required":true,"description":null},{"name":"status_note","type":"string","required":false,"description":"Free-text update from the owner"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":73},{"name":"get_operating_plan","title":null,"description":"Read the organization's active Operating Plan (the workspace at /dashboard/oos-operating-plan): the plan, its eight strategy sections with their content, and the current quarter's execution items. Use this before update_operating_plan_section to see what is already there.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":62},{"name":"update_operating_plan_section","title":null,"description":"Update fields in one section of the organization's active Operating Plan. Provide the section_key and ONLY the fields to change; fields you do not name are preserved (merge, never replace). Common fields: foundation = purpose, mission, values (the core values, one per line), ideal_customer; destination = year_target, ten_year_target, revenue_goal, profit_goal, defining_metric; annual_game_plan = primary_objective, strategic_initiatives, key_outcomes. List-like fields are newline-separated strings.","inputs":[{"name":"fields","type":"object","required":true,"description":"Field key -> new value, only the fields to change. List-like fields take one entry per line."},{"name":"section_key","type":"string","required":true,"description":"Which strategy section to update"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":152},{"name":"list_change_requests","title":null,"description":"See the changes you asked someone else to approve. When you try to change a to-do, number, priority, project or issue that belongs to a seat your person does not hold, OTP does not apply it: it sends the owner a request and the change waits. This lists those requests with their status: pending, applied (approved and done), declined, failed (approved but could not be applied) or expired (7 days, no answer). Requires API key.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":103},{"name":"list_todos","title":null,"description":"List 7-day to-dos (commitments made in a Delta Meeting). Filter by open=true to see only incomplete, by meeting_id, or by owner. A to-do that is a copy of a repeating series carries `repeat` with a plain-English `summary` and its `seriesId`.","inputs":[{"name":"meeting_id","type":"string","required":false,"description":"Only to-dos created in a specific meeting"},{"name":"open","type":"boolean","required":false,"description":"Only return incomplete to-dos"},{"name":"owner_external_id","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":109},{"name":"list_people","title":null,"description":"Everyone in this organization a to-do can be assigned to (people and AI agents) and its teams, each with the identifier add_todo and update_todo take. Use it to put each action item on the person who owns it.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":56},{"name":"add_todo","title":null,"description":"Create a to-do (typically a 7-day commitment from a Delta Meeting). Put it on the person who will do it: pass their name as owner_name and OTP finds them (or owner_external_id from list_people). Never write a person's name into the title, e.g. \"[Owen Cartier] ...\"; the owner is a field, and a to-do filed under the wrong person lands on the wrong person's list. To share one to-do between several people, pass also_assign. Pass `repeat` to make it a repeating to-do: daily, weekly, monthly, yearly or a custom cadence, advancing when each copy is done or on a fixed schedule, with an optional end. The response's todo is the first copy.","inputs":[{"name":"also_assign","type":"array","required":false,"description":"More people who share this one to-do, by name. Each ticks off their own part."},{"name":"description","type":"string","required":false,"description":null},{"name":"due_at","type":"string","required":false,"description":"ISO 8601 datetime; defaults to 7 days from now if omitted"},{"name":"meeting_id","type":"string","required":false,"description":"Meeting in which this to-do was created"},{"name":"owner_entity_type","type":"string","required":false,"description":"Worked out from the owner; only needed with an id OTP does not know."},{"name":"owner_external_id","type":"string","required":false,"description":"The owner's id from list_people. Only needed when two people share a name."},{"name":"owner_name","type":"string","required":false,"description":"Who owns it, by name (\"Owen Cartier\", or a first name only one person has). Enough on its own."},{"name":"repeat","type":"object","required":false,"description":"Make this a repeating to-do. Omit for a one-off."},{"name":"team","type":"string","required":false,"description":"The team it belongs to, by name or id (list_people lists teams). Defaults to the meeting's team when meeting_id is given. A to-do with a team shows on that team's view."},{"name":"title","type":"string","required":true,"description":"What needs to happen. No owner name in brackets."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":393},{"name":"update_todo","title":null,"description":"Change a to-do: its title, description, due date or priority, who it is on, or its team. `assign_to` replaces the people on it (the first is the primary owner); each is a name or a list_people id. Use it to hand a to-do to the person who owns it. Only the fields you pass change.","inputs":[{"name":"assign_to","type":"array","required":false,"description":"Who it should be on, by name or id. Replaces the current set."},{"name":"description","type":"string","required":false,"description":null},{"name":"due_at","type":"string|null","required":false,"description":"ISO 8601 datetime, or null to clear the date."},{"name":"priority","type":"string","required":false,"description":null},{"name":"team","type":"string","required":false,"description":"Move it to a team, by name or id; \"none\" makes it a personal to-do."},{"name":"title","type":"string","required":false,"description":null},{"name":"todo_id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":182},{"name":"complete_todo","title":null,"description":"Mark a to-do as done (or undone if already complete). For a repeating to-do the response's `nextCopy` is the copy just created, if the series produced one.","inputs":[{"name":"done","type":"boolean","required":false,"description":null},{"name":"todo_id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":61},{"name":"set_todo_repeat","title":null,"description":"Make a to-do repeat, change how a repeating to-do repeats, or stop it. Copies already finished or overdue keep their dates.","inputs":[{"name":"repeat","type":"object","required":false,"description":"The new repeat settings. A one-off becomes a series; a series gets the new settings from here on."},{"name":"stop","type":"boolean","required":false,"description":"true: stop the series. This copy stays as a normal to-do; copies already made ahead of their date are removed."},{"name":"todo_id","type":"string","required":true,"description":"The to-do, or any copy of a repeating series."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"list_meetings","title":null,"description":"List Delta Meetings for the authenticated organization, newest first, as summary rows: id, title, when, type, status, team, and whether a transcript and a summary exist. Filter by meeting_type or status; with neither, every type is returned. To find the NEXT meeting, pass upcoming=true: only meetings scheduled from now on, soonest first (newest-first plus a limit would otherwise show the furthest-out recurring instances and miss this week's). This tool deliberately does NOT return transcripts or notes -- call get_meeting_transcript or get_meeting_agenda with an id from here for the contents of one meeting.","inputs":[{"name":"limit","type":"integer","required":false,"description":"How many meetings to return. Defaults to 25."},{"name":"meeting_type","type":"string","required":false,"description":"e.g. 'leadership', 'departmental', '1on1'"},{"name":"status","type":"string","required":false,"description":null},{"name":"upcoming","type":"boolean","required":false,"description":"Only meetings scheduled from now on, soonest first. Use this to find the next meeting."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":208},{"name":"create_meeting","title":null,"description":"Schedule a new Delta Meeting. Returns the meeting object including its ID and the URL of the running meeting page. Pass team_id to put it on a specific team, or team_id null for a personal meeting on no team; omit it and it lands on the organization's default team.","inputs":[{"name":"attendees","type":"array","required":false,"description":null},{"name":"meeting_type","type":"string","required":false,"description":null},{"name":"scheduled_at","type":"string","required":true,"description":"ISO 8601 datetime"},{"name":"team_id","type":null,"required":false,"description":"Team the meeting belongs to. Omit for the org's default team; pass null for a personal meeting on no team."},{"name":"title","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":130},{"name":"get_meeting_agenda","title":null,"description":"Get one meeting's agenda: the meeting itself, the scorecard snapshot (with each KPI's latest value), the rocks snapshot, OPEN issues (status open or in_progress) and OPEN to-dos, trimmed to the fields an agenda needs, plus counts of the closed and done items left out. Issues and to-dos are the organization's, not filtered to the meeting's team. Pass include_closed=true to also get recently resolved issues and done to-dos. Use to prep, render or summarize a meeting.","inputs":[{"name":"include_closed","type":"boolean","required":false,"description":"Also return resolved/closed issues and done to-dos (the 100 most recent of each). Default false: open items only."},{"name":"meeting_id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":156},{"name":"get_meeting_transcript","title":null,"description":"Read a meeting's transcript -- what was actually said in the room. Use this whenever someone asks about the CONTENT of a meeting: what was decided, who said what, what a number was, what someone committed to. get_meeting_agenda returns a meeting's structure; this returns its words. Long transcripts arrive one window at a time -- if next_offset comes back there is more, so keep reading before you answer. When has_transcript is false, say plainly that no transcript is attached rather than guessing at what was said. This tool is off unless the organization's Owner has enabled transcript reading; if it refuses, relay that plainly and say the Owner can turn it on in Settings, Redaction. Never imply the refusal is a bug or that you can work around it.","inputs":[{"name":"meeting_id","type":"string","required":true,"description":null},{"name":"offset","type":"integer","required":false,"description":"Character offset to read from. Omit to start at the beginning; pass the next_offset from the previous call to continue."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":206},{"name":"start_meeting","title":null,"description":"Start a Delta Meeting -- snapshots current scorecard and rocks into the meeting record so the agenda is frozen at meeting time.","inputs":[{"name":"meeting_id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":41},{"name":"end_meeting","title":null,"description":"End a Delta Meeting. Marks status complete and stamps endedAt.","inputs":[{"name":"meeting_id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":30},{"name":"list_whiteboards","title":null,"description":"List the organization's whiteboards -- shared visual canvases where people sketch and arrange sticky notes together, sometimes alongside a meeting. Returns each board's id, title, status ('draft', 'active', or 'filed'), the meeting it is attached to if any, who created it, and when it last changed. Filter by status, or by meeting_id to find the board a specific meeting used. This is the index only; use read_whiteboard to see what is written on a board.","inputs":[{"name":"meeting_id","type":"string","required":false,"description":"Only boards attached to this meeting"},{"name":"status","type":"string","required":false,"description":"Only boards in this state"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":134},{"name":"read_whiteboard","title":null,"description":"Read what is currently written on a whiteboard: the text of its sticky notes and shapes, grouped by frame, as a plain-text outline. This is the CURRENT contents of a live collaborative canvas that people may still be editing -- not a finished document, and not a history of what the board used to say. Only text comes through: drawings, arrows, and images have nothing to extract, so a busy-looking board can honestly come back sparse. When note_count is 0, say the board has no readable text rather than guessing at what is drawn on it. Find a board's id with list_whiteboards. Very large boards are cut off; `truncated` tells you when.","inputs":[{"name":"whiteboard_id","type":"string","required":true,"description":"From list_whiteboards"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":161},{"name":"add_issue","title":null,"description":"Raise an issue on this organization's own issues list, where it lands on the issues board and on the Issues section of that team's Delta Meeting. Use this when someone wants something on the agenda: a problem to work through, a decision to make, a topic to raise. Pass team_id to put it in front of a specific team's meeting -- get it from list_meetings, which returns each meeting's teamId; omit it and the issue is org-wide and unassigned, which is a real state, not a failure. This is the org's OWN issue list. To report a bug or request a feature FROM the OTP vendor, use submit_ticket instead -- the two look similar and go to completely different places.","inputs":[{"name":"category","type":"string","required":false,"description":"Default 'other', which is what an agenda item usually is"},{"name":"description","type":"string","required":false,"description":"Detail, if the person gave any. Do NOT invent one: leave it out and the issue records where it came from instead."},{"name":"horizon","type":"string","required":false,"description":"'short' (default) is worked day to day; 'long' parks it for the quarterly."},{"name":"owner_entity_type","type":"string","required":false,"description":null},{"name":"owner_external_id","type":"string","required":false,"description":"Seat that owns the issue, e.g. 'HUM_DAVIDSTEEL' or 'AGT_RADAR'"},{"name":"owner_name","type":"string","required":false,"description":null},{"name":"priority","type":"string","required":false,"description":"Default medium"},{"name":"team_id","type":null,"required":false,"description":"Team whose meeting should show this issue, from list_meetings' teamId. Omit or pass null for an org-wide issue on no team."},{"name":"title","type":"string","required":true,"description":"The issue as the person said it, e.g. 'Feedback for customers wanting to cancel'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":350},{"name":"set_issue_status","title":null,"description":"Move an issue (ticket) through the identify, discuss and solve lifecycle. Optionally rank an issue (priorityRank=1 means top priority).","inputs":[{"name":"ids_status","type":"string","required":false,"description":null},{"name":"priority_rank","type":null,"required":false,"description":null},{"name":"resolution","type":"string","required":false,"description":"Solution captured when moving to 'solved'"},{"name":"solved_in_meeting_id","type":null,"required":false,"description":null},{"name":"ticket_id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":84},{"name":"list_processes","title":null,"description":"List this organization's processes (SOPs written on agent seats) together with any schedules already attached to them. Use this BEFORE creating, changing, or running a schedule: it is the only place the real agent externalId and SOP title come from, and both are required by the other process tools. The response also tells you whether autonomous runs are currently armed for the deployment (schedulerArmed) and whether this org is allowed to schedule at all (gate). Never guess an externalId or a SOP title; if this returns nothing, the org has no processes to schedule yet.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":125},{"name":"create_schedule","title":null,"description":"Schedule a process to run automatically on a recurring cadence -- hourly, daily, or weekly -- in a named timezone. This is real autonomy: once created and enabled, OTP runs the SOP on its own and the run spends the organization's wallet, with no human in the session. Call list_processes first and pass the exact agent_external_id and sop_title it returned. Cadence is limited to hourly/daily/weekly by design; there is no raw cron and no weekdays-only option, so say so plainly rather than approximating one. Requires a funded wallet and an active API key.","inputs":[{"name":"agent_external_id","type":"string","required":true,"description":"The seat that owns the process, exactly as list_processes returned it (e.g. 'AGT_RADAR')"},{"name":"cadence","type":"string","required":true,"description":"How often it runs"},{"name":"hour","type":"integer","required":false,"description":"Hour of day, 0-23, in the schedule's timezone. Required for daily and weekly; ignored for hourly. 10 means 10am."},{"name":"minute","type":"integer","required":false,"description":"Minute of the hour, 0-59. Defaults to 0."},{"name":"name","type":"string","required":false,"description":"Label for the schedule. Defaults to the SOP title."},{"name":"sop_id","type":"string","required":false,"description":"SOP id when list_processes returned one; more precise than matching on title"},{"name":"sop_title","type":"string","required":true,"description":"Exact title of the SOP to run, as list_processes returned it"},{"name":"timezone","type":"string","required":false,"description":"IANA timezone the hour is read in, e.g. 'America/New_York'. Defaults to America/New_York. Ask rather than assume when the user's timezone is not already known."},{"name":"weekday","type":"integer","required":false,"description":"Day of week for weekly, 0=Sunday through 6=Saturday. Defaults to Monday."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":359},{"name":"update_schedule","title":null,"description":"Change an existing schedule: pause it (enabled=false), resume it (enabled=true), or move when it runs. Pausing is the right answer when someone wants a schedule to stop for now; deleting throws away the setup. Any cadence field left out keeps its current value, so moving a daily run from 9am to 10am needs only hour=10. Get the schedule id from list_processes.","inputs":[{"name":"cadence","type":"string","required":false,"description":null},{"name":"enabled","type":"boolean","required":false,"description":"false pauses the schedule, true resumes it"},{"name":"hour","type":"integer","required":false,"description":null},{"name":"minute","type":"integer","required":false,"description":null},{"name":"schedule_id","type":"string","required":true,"description":"Schedule id from list_processes"},{"name":"timezone","type":"string","required":false,"description":"IANA timezone, e.g. 'America/New_York'"},{"name":"weekday","type":"integer","required":false,"description":"0=Sunday through 6=Saturday"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":176},{"name":"delete_schedule","title":null,"description":"Delete a schedule permanently. Prefer update_schedule with enabled=false when the intent is 'stop it for now' -- a pause is reversible in one click and a delete is not. Get the schedule id from list_processes.","inputs":[{"name":"schedule_id","type":"string","required":true,"description":"Schedule id from list_processes"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":66},{"name":"run_process","title":null,"description":"Run a process once, right now, instead of waiting for its schedule. The run spends the organization's wallet. Use this when someone wants the result immediately, or wants to see what a process produces before committing it to a schedule -- running it once first is usually the better order. Call list_processes for the exact agent externalId and SOP title.","inputs":[{"name":"agent_external_id","type":"string","required":true,"description":"The seat that owns the process, from list_processes"},{"name":"sop_id","type":"string","required":false,"description":"SOP id when list_processes returned one"},{"name":"sop_title","type":"string","required":true,"description":"Exact SOP title, from list_processes"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":130},{"name":"my_coaching","title":null,"description":"What needs attention for the person asking: observations OTP has computed about the seats they hold, each with the suggested next actions attached. Returns only their own seats -- never a colleague's, never a direct report's. Answers with what the evaluation engine actually wrote; if it has not run there is nothing to report and the tool says so rather than estimating. ALSO returns openQuestions: things only this person can tell OTP, which it cannot observe. When any are present, say which part of the picture is missing and ask ONE of them conversationally at the end of your answer -- never a list, never all of them, and never before you have answered what they actually asked. Record the reply with answer_coaching_question.","inputs":[{"name":"question","type":"string","required":false,"description":"The person's question in their own words, e.g. 'what should I fix first?'. Steers what to lead with; never changes what exists."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":191},{"name":"approve_coaching_action","title":null,"description":"Approve one suggested action and carry it out -- creating the to-do, issue, measurable or meeting exactly as it was shown. The approving seat is taken from the caller's own session, never from arguments. Only ever call this after the person has seen the proposal and said yes.","inputs":[{"name":"intervention_id","type":"string","required":true,"description":"The intervention the person approved"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":80},{"name":"decline_coaching_action","title":null,"description":"Decline a suggested action, with the reason in the person's own words. Declining the suggestion is not the same as dismissing the observation -- the underlying finding stays, and Ollie may offer a different way in.","inputs":[{"name":"intervention_id","type":"string","required":true,"description":null},{"name":"reason","type":"string","required":true,"description":"Why, in their words. A refusal with no reason teaches nothing."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":82},{"name":"set_coaching_disposition","title":null,"description":"Record what the person decided about an observation itself. 'snoozed' goes quiet until a date. 'dismissed' goes quiet for 90 days and returns quoting their reason back. 'not_our_way' means this is genuinely not how this team works and the check never raises it for that seat again. 'acted_on' means they handled it. Use this whenever somebody says a suggestion is not relevant -- it is how Ollie learns to stop.","inputs":[{"name":"finding_id","type":"string","required":true,"description":null},{"name":"reason","type":"string","required":false,"description":"Required for 'dismissed' and 'not_our_way'"},{"name":"snoozed_until","type":"string","required":false,"description":"ISO date; required for 'snoozed'"},{"name":"state","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":159},{"name":"my_coaching_questions","title":null,"description":"The handful of questions only this person can answer about their own seat -- whether they are clear on what they own, whether they could describe where the organization is going, whether the recurring work is done the same way everyone else does it. OTP cannot observe any of that, so it asks. Returns only unanswered questions for the current period, and only for seats the caller holds. Ask these conversationally, one at a time, and never all at once.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":101},{"name":"answer_coaching_question","title":null,"description":"Record the person's own answer about their own seat: yes, partly, or no, plus anything they said in their own words. 'partly' is a real answer and usually the most useful one -- do not round it to yes or no. Only ever call this with what they actually said; never infer an answer from tone or from what they said about something else.","inputs":[{"name":"check_key","type":"string","required":true,"description":"From my_coaching_questions"},{"name":"check_version","type":"integer","required":true,"description":"From my_coaching_questions"},{"name":"note","type":"string","required":false,"description":"Their own words, verbatim where possible"},{"name":"response","type":"string","required":true,"description":null},{"name":"seat_external_id","type":"string","required":true,"description":"The seat the question is about; must be one the caller holds"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":155}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T04:24:29.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":null,"reasonLabel":null,"discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":92,"partial":false,"deprecated":null,"stale":30,"noRepo":null}},"mismatches":[],"changelog":{"trackingSince":"2026-10-30","recent":[{"id":"chg_01a1902d-b5f3-73f0-91b1-a3c280e6c4ef","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server#chg-chg_01a1902d-b5f3-73f0-91b1-a3c280e6c4ef"},{"id":"chg_01a1902d-b5f7-78f7-b6dd-ed88d80fb7d6","kind":"score.total_changed","summary":"Trust score (47 → 62)","materiality":"functional","direction":"improvement","scoreDelta":15,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server#chg-chg_01a1902d-b5f7-78f7-b6dd-ed88d80fb7d6"},{"id":"chg_01a18d3f-07eb-78d8-a0df-02521a7136d1","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server#chg-chg_01a18d3f-07eb-78d8-a0df-02521a7136d1"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server/changelog.json"},"links":{"html":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server","markdown":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server.md","changelogJson":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server/changelog.json","changelogRss":"https://verifymcp.io/servers/david-steel-otp/otp-mcp-server.xml","external":[{"label":"npm package","href":"https://www.npmjs.com/package/otp-mcp-server"},{"label":"Socket report","href":"https://socket.dev/npm/package/otp-mcp-server"},{"label":"Website","href":"https://orgtp.com/"}]}}