{"apiVersion":"v1","directorySlug":"teampitch-mcp-12e619d2b2","title":"Teampitch","description":null,"pageUrl":"https://www.mcpbundles.com/skills/teampitch-mcp-12e619d2b2","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://api.teampitch.app/mcp","hostedMcpUrl":null,"toolCount":37,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"app.teampitch/teampitch-mcp-12e619d2b2","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"List.Create","description":"Create a durable List attached to a business subject. Use kinds such as requirements, actions, people, evidence, checklist, or generic. The agent and humans share the same list over time.","inputSchema":{"type":"object","required":["kind","title","subjectKind","subjectId"],"properties":{"kind":{"enum":["requirements","actions","people","evidence","checklist","generic"],"type":"string"},"metadata":{"anyOf":[{},{"type":"null"}]},"subjectId":{"type":"string","allOf":[{"minLength":1}]},"subjectKind":{"enum":["opportunity","consultant"],"type":"string"}},"additionalProperties":false},"logicalName":"List.Create","displayName":"List.Create","title":"List.Create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"List.Get","description":"Load a List and all of its items in display order. Use this before updating items so you have ids and current state.","inputSchema":{"type":"object","required":["listId"],"properties":{"listId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"List.Get","displayName":"List.Get","title":"List.Get","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"List.ListForSubject","description":"List Lists attached to a subject such as an opportunity. Optionally filter by kind when you need the requirements list vs the actions list.","inputSchema":{"type":"object","required":["subjectKind","subjectId"],"properties":{"kind":{"anyOf":[{"enum":["requirements","actions","people","evidence","checklist","generic"],"type":"string"},{"type":"null"}]},"subjectId":{"type":"string","allOf":[{"minLength":1}]},"subjectKind":{"enum":["opportunity","consultant"],"type":"string"}},"additionalProperties":false},"logicalName":"List.ListForSubject","displayName":"List.ListForSubject","title":"List.ListForSubject","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"List.UpsertItems","description":"Create or update List items in bulk. Pass item id to update an existing row; omit id to append. Optionally pass deleteItemIds to remove rows. Prefer this over many single-item writes.","inputSchema":{"type":"object","required":["listId","items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["title"],"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"refId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"status":{"anyOf":[{"enum":["suggested","open","waiting","done","dismissed"],"type":"string"},{"type":"null"}]},"payload":{"anyOf":[{},{"type":"null"}]},"refKind":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]}},"additionalProperties":false}},"listId":{"type":"string","allOf":[{"minLength":1}]},"deleteItemIds":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]}},"additionalProperties":false},"logicalName":"List.UpsertItems","displayName":"List.UpsertItems","title":"List.UpsertItems","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"List.ReorderItems","description":"Reorder List items by passing every item id in the desired order. All items in the list must be included.","inputSchema":{"type":"object","required":["listId","itemIds"],"properties":{"listId":{"type":"string","allOf":[{"minLength":1}]},"itemIds":{"type":"array","items":{"type":"string","allOf":[{"minLength":1}]}}},"additionalProperties":false},"logicalName":"List.ReorderItems","displayName":"List.ReorderItems","title":"List.ReorderItems","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Requirement.ExtractFromText","description":"Extract structured requirements from a procurement/RFP document text and persist them to the opportunity. Returns the count and ids of created requirement rows.","inputSchema":{"type":"object","required":["opportunityId","sourceText"],"properties":{"sourceText":{"type":"string"},"opportunityId":{"type":"string"},"sourceDocumentId":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Requirement.ExtractFromText","displayName":"Requirement.ExtractFromText","title":"Requirement.ExtractFromText","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Opportunity.Get","description":"Fetch a single opportunity by id. Returns the full row including updatedAt — use that value as `expectedUpdatedAt` on a subsequent Opportunity.Update. Caller must have 'view' access; respects org scope and visibility.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Opportunity.Get","displayName":"Opportunity.Get","title":"Opportunity.Get","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Opportunity.Create","description":"Create a new opportunity owned by the caller. Required: title. Optional: clientName, deadline (ISO 8601), sourceArtifactIds. When creating from an uploaded RFP, pass the exact sourceArtifactIds from the current conversation sources; ids outside the conversation context are rejected. The caller is recorded as owner with full access. Sources are linked as opportunity documents and their extracted text is used to persist requirement rows. Returns the new opportunity row.","inputSchema":{"type":"object","required":["title"],"properties":{"deadline":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"clientName":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"sourceArtifactIds":{"anyOf":[{"type":"array","items":{"type":"string","allOf":[{"format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000)$"}]}},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Opportunity.Create","displayName":"Opportunity.Create","title":"Opportunity.Create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Opportunity.Update","description":"Update fields on an existing opportunity. Pass `expectedUpdatedAt` from a prior fetch — if it does not match the current row, the call fails with stomp_detected and you should re-fetch and re-confirm with the user before retrying. Only provided fields are written. Caller must have 'update' access on the opportunity.","inputSchema":{"type":"object","required":["id","expectedUpdatedAt"],"properties":{"id":{"type":"string","allOf":[{"minLength":1}]},"stage":{"anyOf":[{"enum":["contacted","qualifying","meeting","proposal","negotiation","won","lost"],"type":"string"},{"type":"null"}]},"deadline":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"clientName":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"visibility":{"anyOf":[{"enum":["private","org"],"type":"string"},{"type":"null"}]},"expectedUpdatedAt":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Opportunity.Update","displayName":"Opportunity.Update","title":"Opportunity.Update","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Requirement.Upsert","description":"Create or update a single requirement on an opportunity. Pass `id` to update an existing requirement (the row must belong to the same opportunity), or omit `id` to insert a new one. `type` is one of skill/experience/commercial/logistical/compliance/process/other; `structured` is a free-form payload whose shape depends on type. Caller must have 'update' access on the opportunity. Last-write-wins — there is no expectedUpdatedAt field.","inputSchema":{"type":"object","required":["opportunityId","type","text","mandatory"],"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}]},"text":{"type":"string","allOf":[{"minLength":1}]},"type":{"enum":["skill","experience","commercial","logistical","compliance","process","other"],"type":"string"},"mandatory":{"type":"boolean"},"sourcePage":{"anyOf":[{"anyOf":[{"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]},{"type":"null"}]},"structured":{"anyOf":[{},{"type":"null"}]},"opportunityId":{"type":"string","allOf":[{"minLength":1}]},"sourceDocumentId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Requirement.Upsert","displayName":"Requirement.Upsert","title":"Requirement.Upsert","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Requirement.Delete","description":"Delete a requirement by id. Caller must have 'update' access on the parent opportunity. Returns { ok: true, id }.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Requirement.Delete","displayName":"Requirement.Delete","title":"Requirement.Delete","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Worklist.Create","description":"Compatibility alias for creating an item in an opportunity's durable actions List. Prefer List.* for new structured working material; use this for simple opportunity next actions, questions, blockers, approvals, or evidence tasks. Caller must have 'update' access on the opportunity. Source is recorded as agent.","inputSchema":{"type":"object","required":["opportunityId","title","type"],"properties":{"type":{"enum":["action","question","blocker","approval","evidence"],"type":"string"},"ownerId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"priority":{"anyOf":[{"enum":["low","normal","high"],"type":"string"},{"type":"null"}]},"ownerType":{"anyOf":[{"enum":["ai","user","role","external"],"type":"string"},{"type":"null"}]},"opportunityId":{"type":"string","allOf":[{"minLength":1}]},"linkedEntityId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"linkedEntityKind":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Worklist.Create","displayName":"Worklist.Create","title":"Worklist.Create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Worklist.List","description":"Compatibility alias for listing an opportunity's durable actions List items. Use before creating simple next-action suggestions so you do not create duplicates, and to find item ids before updating status or agent state. Excludes dismissed items by default.","inputSchema":{"type":"object","required":["opportunityId"],"properties":{"opportunityId":{"type":"string","allOf":[{"minLength":1}]},"includeDismissed":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Worklist.List","displayName":"Worklist.List","title":"Worklist.List","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Worklist.UpdateStatus","description":"Compatibility alias for updating an item status in an opportunity's durable actions List. Use only for explicit user-approved changes or status transitions caused by completed agent work. Caller must have 'update' access on the opportunity.","inputSchema":{"type":"object","required":["opportunityId","itemId","status"],"properties":{"itemId":{"type":"string","allOf":[{"minLength":1}]},"status":{"enum":["suggested","open","waiting","done","dismissed"],"type":"string"},"opportunityId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Worklist.UpdateStatus","displayName":"Worklist.UpdateStatus","title":"Worklist.UpdateStatus","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Worklist.UpdateAgentState","description":"Compatibility alias for updating execution state on an opportunity actions List item. Use this when queued agent work starts, becomes blocked, becomes ready for human review, fails, or is cancelled. Preserve the List item; attach resultKind/resultId for reviewable drafts, response material, or sources when available.","inputSchema":{"type":"object","required":["opportunityId","itemId","agentStatus"],"properties":{"error":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"itemId":{"type":"string","allOf":[{"minLength":1}]},"resultId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"resultKind":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"agentAction":{"anyOf":[{"enum":["draft_email","check_evidence","rewrite_response_section","prepare_follow_up"],"type":"string"},{"type":"null"}]},"agentStatus":{"enum":["queued","running","blocked","ready","ready_for_review","failed","cancelled"],"type":"string"},"opportunityId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Worklist.UpdateAgentState","displayName":"Worklist.UpdateAgentState","title":"Worklist.UpdateAgentState","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"ResponsePackage.Create","description":"Create a draft response package for an opportunity. A response package is the MCP-first workspace for building proposal sections, consultant evidence, and exportable response material. Caller must have update access on the opportunity.","inputSchema":{"type":"object","required":["opportunityId","title"],"properties":{"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"opportunityId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"ResponsePackage.Create","displayName":"ResponsePackage.Create","title":"ResponsePackage.Create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"ResponsePackage.List","description":"List response packages for an opportunity. Use this before creating a package to avoid duplicates and to find package ids before updating status or adding future package items.","inputSchema":{"type":"object","required":["opportunityId"],"properties":{"opportunityId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"ResponsePackage.List","displayName":"ResponsePackage.List","title":"ResponsePackage.List","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Search.Global","description":"Full-text search across opportunities, consultants, documents, requirements, and chat messages scoped to the caller org. Returns ranked hits with entity type, id, title, snippet, score, and a typed target when the hit maps to an openable product entity. Use this when you need to find something but do not know which entity it is. Pass `query: \"\"` (empty string) to list everything in scope; do not pass wildcards like `*`.","inputSchema":{"type":"object","required":["query"],"properties":{"limit":{"anyOf":[{"allOf":[{"maximum":100,"minimum":1}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]},"query":{"type":"string"},"entityTypes":{"anyOf":[{"type":"array","items":{"enum":["opportunity","consultant","document","requirement","message"],"type":"string"}},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Search.Global","displayName":"Search.Global","title":"Search.Global","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Source.List","description":"List Teampitch source providers: the typed durable knowledge surfaces an agent can query or update, the tools that reach them, and the provenance required before writing source-backed output. Use this before choosing tools when the user asks what context exists or when a workflow needs source-backed material.","inputSchema":{"anyOf":[{"type":"object"},{"type":"array"}]},"logicalName":"Source.List","displayName":"Source.List","title":"Source.List","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Search","description":"List consultants in the caller's org. Filter by skill names (matches consultant_skills.skill case-insensitively), seniority levels, office, availability date, hourly rate ceiling, and free-text query. Returns ranked results with the matched skills surfaced so the model can explain why each consultant came up.","inputSchema":{"type":"object","properties":{"limit":{"anyOf":[{"allOf":[{"maximum":100,"minimum":1}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]},"query":{"anyOf":[{"type":"string"},{"type":"null"}]},"office":{"anyOf":[{"type":"string"},{"type":"null"}]},"offset":{"anyOf":[{"allOf":[{"minimum":0}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]},"skills":{"anyOf":[{"type":"array","items":{"type":"string","allOf":[{"minLength":1}]}},{"type":"null"}]},"availableBy":{"anyOf":[{"type":"string"},{"type":"null"}]},"seniorities":{"anyOf":[{"type":"array","items":{"enum":["junior","mid","senior","principal"],"type":"string"}},{"type":"null"}]},"maxHourlyRateCents":{"anyOf":[{"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Consultant.Search","displayName":"Consultant.Search","title":"Consultant.Search","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Match","description":"Score a consultant against a set of requirement IDs from the same org. Each requirement is scored by a typed sub-scorer: skill requirements check consultant_skills (proficiency + years), experience requirements check consultant_industry_experience and project history, logistical requirements check office/location, others fall back to keyword overlap. The overall score is a mandatory-weighted average — must-have requirements count 2x. Returns per-requirement score in [0,1], matched terms, and a r","inputSchema":{"type":"object","required":["consultantId","requirementIds"],"properties":{"consultantId":{"type":"string"},"requirementIds":{"type":"array","allOf":[{"minItems":1}],"items":{"type":"string","allOf":[{"minLength":1}]}}},"additionalProperties":false},"logicalName":"Consultant.Match","displayName":"Consultant.Match","title":"Consultant.Match","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Create","description":"Create a new consultant in the caller org from extracted CV/resume fields. Required: fullName, email, seniority (junior/mid/senior/principal), availabilityFrom (ISO date), hourlyRateCents, bio. Optional nested arrays for skills, industries, projects, and profileValues. Use profileValues for firm-specific roster facts such as practice, sector, language, certification, clearance, methodology, grade, or other tenant-specific fields. The whole insert is atomic — partial failures roll back. Before ca","inputSchema":{"type":"object","required":["fullName","email","seniority","availabilityFrom","hourlyRateCents","bio"],"properties":{"bio":{"type":"string"},"email":{"type":"string","allOf":[{"minLength":1}]},"office":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"skills":{"anyOf":[{"type":"array","items":{"type":"object","required":["skill","proficiency","yearsExperience"],"properties":{"skill":{"type":"string","allOf":[{"minLength":1}]},"interest":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}]},"proficiency":{"enum":["beginner","intermediate","expert"],"type":"string"},"yearsExperience":{"allOf":[{"minimum":0}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]}},"additionalProperties":false}},{"type":"null"}]},"fullName":{"type":"string","allOf":[{"minLength":1}]},"projects":{"anyOf":[{"type":"array","items":{"type":"object","required":["title","clientName","role","startedAt","summary"],"properties":{"role":{"type":"string","allOf":[{"minLength":1}]},"endedAt":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"summary":{"type":"string","allOf":[{"minLength":1}]},"startedAt":{"type":"string","allOf":[{"minLength":1}]},"clientName":{"type":"string","allOf":[{"minLength":1}]},"clientAnonymized":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":false}},{"type":"null"}]},"salesNote":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"seniority":{"enum":["junior","mid","senior","principal"],"type":"string"},"industries":{"anyOf":[{"type":"array","items":{"type":"object","required":["industry","years"],"properties":{"years":{"allOf":[{"minimum":0}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},"industry":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false}},{"type":"null"}]},"linkedinUrl":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"profileValues":{"anyOf":[{"type":"array","items":{"type":"object","required":["fieldKey","label","value"],"properties":{"type":{"anyOf":[{"enum":["text","number","date","select","multi_select","boolean","url","json"],"type":"string"},{"type":"null"}]},"label":{"type":"string","allOf":[{"minLength":1}]},"value":{},"source":{"anyOf":[{"enum":["manual","import","agent"],"type":"string"},{"type":"null"}]},"category":{"anyOf":[{"enum":["capability","industry","role","certification","language","education","location","commercial","compliance","custom"],"type":"string"},{"type":"null"}]},"fieldKey":{"type":"string","allOf":[{"minLength":1}]},"confidence":{"anyOf":[{"anyOf":[{"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]},{"type":"null"}]}},"additionalProperties":false}},{"type":"null"}]},"hourlyRateCents":{"allOf":[{"minimum":0}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},"availabilityFrom":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Consultant.Create","displayName":"Consultant.Create","title":"Consultant.Create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Get","description":"Fetch a single consultant in the caller's org with all relations (skills, projects, industries). Returns the full row including updatedAt — use that value as `expectedUpdatedAt` on a subsequent Consultant.Update. Project ids in the result are needed to call Project.Update / Project.Delete.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Consultant.Get","displayName":"Consultant.Get","title":"Consultant.Get","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Update","description":"Update fields on an existing consultant. Pass `expectedUpdatedAt` from a prior Consultant.Get — if it doesn't match the current row, fails with stomp_detected and you should re-fetch and re-confirm before retrying. Only provided fields are written. Use this for sales note edits, rate changes, office moves, seniority bumps, etc. Caller must have 'consultant:update' permission.","inputSchema":{"type":"object","required":["id","expectedUpdatedAt"],"properties":{"id":{"type":"string","allOf":[{"minLength":1}]},"bio":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string","allOf":[{"minLength":1}]},{"type":"null"}]},"office":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"fullName":{"anyOf":[{"type":"string","allOf":[{"minLength":1}]},{"type":"null"}]},"salesNote":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"seniority":{"anyOf":[{"enum":["junior","mid","senior","principal"],"type":"string"},{"type":"null"}]},"linkedinUrl":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"hourlyRateCents":{"anyOf":[{"allOf":[{"minimum":0}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]},"availabilityFrom":{"anyOf":[{"type":"string","allOf":[{"minLength":1}]},{"type":"null"}]},"expectedUpdatedAt":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Consultant.Update","displayName":"Consultant.Update","title":"Consultant.Update","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Skill.Upsert","description":"Add or update one consultant_skills row. Composite key is (consultantId, skill) — passing the same skill name updates the existing row's proficiency / interest / years. interest defaults to 'medium' when omitted. Last-write-wins (no stomp protection on individual skills). Caller must have 'consultant:update' permission.","inputSchema":{"type":"object","required":["consultantId","skill","proficiency","yearsExperience"],"properties":{"skill":{"type":"string","allOf":[{"minLength":1}]},"interest":{"anyOf":[{"enum":["low","medium","high"],"type":"string"},{"type":"null"}]},"proficiency":{"enum":["beginner","intermediate","expert"],"type":"string"},"consultantId":{"type":"string","allOf":[{"minLength":1}]},"yearsExperience":{"allOf":[{"minimum":0}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]}},"additionalProperties":false},"logicalName":"Skill.Upsert","displayName":"Skill.Upsert","title":"Skill.Upsert","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Skill.Delete","description":"Remove one consultant_skills row by (consultantId, skill). No-op if the skill isn't on the consultant. Caller must have 'consultant:update' permission.","inputSchema":{"type":"object","required":["consultantId","skill"],"properties":{"skill":{"type":"string","allOf":[{"minLength":1}]},"consultantId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Skill.Delete","displayName":"Skill.Delete","title":"Skill.Delete","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Project.Update","description":"Update fields on a consultant_projects row. Common use: set `endedAt` to a YYYY-MM-DD to mark a project as ended (this also flips the parent consultant's status from 'engaged' to 'available'). Set `endedAt: null` to mark it ongoing. Look up the projectId via Consultant.Get first. Last-write-wins (no stomp). Caller must have 'consultant:update' permission.","inputSchema":{"type":"object","required":["projectId"],"properties":{"role":{"anyOf":[{"type":"string","allOf":[{"minLength":1}]},{"type":"null"}]},"endedAt":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"summary":{"anyOf":[{"type":"string","allOf":[{"minLength":1}]},{"type":"null"}]},"projectId":{"type":"string","allOf":[{"minLength":1}]},"startedAt":{"anyOf":[{"type":"string","allOf":[{"minLength":1}]},{"type":"null"}]},"clientName":{"anyOf":[{"type":"string","allOf":[{"minLength":1}]},{"type":"null"}]},"clientAnonymized":{"anyOf":[{"type":"boolean"},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Project.Update","displayName":"Project.Update","title":"Project.Update","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Project.Delete","description":"Delete a consultant_projects row by id. Caller must have 'consultant:update' permission. Use only when the project was added in error — to mark a project as ended, use Project.Update with endedAt.","inputSchema":{"type":"object","required":["projectId"],"properties":{"projectId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Project.Delete","displayName":"Project.Delete","title":"Project.Delete","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Evidence.Create","description":"Create or deduplicate a consultant evidence claim in the caller org. Use this for company-brain memory extracted from conversations, documents, worklist items, response packages, or manual curation. Claims are not automatically client-safe: default visibility is internal, status is suggested, and clientSafe is false. Confirm evidence before using it in client pitches or exports.","inputSchema":{"type":"object","required":["consultantId","title","claim"],"properties":{"claim":{"type":"string","allOf":[{"minLength":1}]},"status":{"anyOf":[{"enum":["draft","active","stale","rejected","superseded"],"type":"string"},{"type":"null"}]},"fieldId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"metadata":{"anyOf":[{"type":"object"},{"type":"null"}]},"sourceId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"claimType":{"anyOf":[{"type":"string"},{"type":"null"}]},"sourceUrl":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"clientSafe":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"confidence":{"anyOf":[{"allOf":[{"maximum":100,"minimum":0}],"anyOf":[{"type":"number"},{"enum":["NaN"],"type":"string"},{"enum":["Infinity"],"type":"string"},{"enum":["-Infinity"],"type":"string"}]},{"type":"null"}]},"sourceKind":{"anyOf":[{"enum":["manual","import","agent","document","activity","worklist_item","resume_draft"],"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"enum":["private","internal","client_safe"],"type":"string"},{"type":"null"}]},"sourceLabel":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"consultantId":{"type":"string","allOf":[{"minLength":1}]},"supersededByClaimId":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"null"}]},{"type":"null"}]},"confidentialityLevel":{"anyOf":[{"enum":["non_confidential","confidential"],"type":"string"},{"type":"null"}]}},"additionalProperties":false},"logicalName":"Consultant.Evidence.Create","displayName":"Consultant.Evidence.Create","title":"Consultant.Evidence.Create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Evidence.List","description":"List evidence claims for a consultant in the caller org, optionally filtered by status, visibility, or outputKind. When outputKind is client_pitch or export, only confirmed, client-visible, clientSafe evidence is returned. Use this before matching, writing a response package, or making client-visible claims.","inputSchema":{"type":"object","required":["consultantId"],"properties":{"status":{"anyOf":[{"enum":["draft","active","stale","rejected","superseded"],"type":"string"},{"type":"null"}]},"outputKind":{"anyOf":[{"enum":["internal","client_facing"],"type":"string"},{"type":"null"}]},"visibility":{"anyOf":[{"enum":["private","internal","client_safe"],"type":"string"},{"type":"null"}]},"consultantId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Consultant.Evidence.List","displayName":"Consultant.Evidence.List","title":"Consultant.Evidence.List","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Evidence.Confirm","description":"Mark a consultant evidence claim as confirmed by the current user. Use only after explicit human confirmation or a trusted source check. Confirmed evidence can be considered for client-facing output only when visibility is client and clientSafe is true.","inputSchema":{"type":"object","required":["evidenceClaimId"],"properties":{"evidenceClaimId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Consultant.Evidence.Confirm","displayName":"Consultant.Evidence.Confirm","title":"Consultant.Evidence.Confirm","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Consultant.Evidence.Reject","description":"Reject a consultant evidence claim in the caller org. Rejected evidence must not be used for matching rationale, client pitches, or exports.","inputSchema":{"type":"object","required":["evidenceClaimId"],"properties":{"evidenceClaimId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Consultant.Evidence.Reject","displayName":"Consultant.Evidence.Reject","title":"Consultant.Evidence.Reject","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Proposal.Create","description":"Create a new proposal draft attached to an opportunity. Required: opportunityId, title. Optional: body (markdown). The caller is recorded as owner; status starts as 'draft'. Caller must have 'update' access on the parent opportunity.","inputSchema":{"type":"object","required":["opportunityId","title"],"properties":{"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"opportunityId":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Proposal.Create","displayName":"Proposal.Create","title":"Proposal.Create","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Proposal.Get","description":"Fetch a proposal by id. Returns the full row including updatedAt — pass that value as `expectedUpdatedAt` on a subsequent Proposal.Update. Caller must have 'view' access on the parent opportunity.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Proposal.Get","displayName":"Proposal.Get","title":"Proposal.Get","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"Proposal.Update","description":"Update draft fields on an existing proposal. Pass `expectedUpdatedAt` from a prior fetch — if it doesn't match the current row, fails with stomp_detected and you should re-fetch and re-confirm with the user before retrying. The tool may keep work in draft/rejected states, but cannot mark client-facing sent or accepted states; those require human approval outside the agent tool. Caller must have 'update' access on the parent opportunity.","inputSchema":{"type":"object","required":["id","expectedUpdatedAt"],"properties":{"id":{"type":"string","allOf":[{"minLength":1}]},"body":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"anyOf":[{"enum":["draft","sent","accepted","rejected"],"type":"string"},{"type":"null"}]},"expectedUpdatedAt":{"type":"string","allOf":[{"minLength":1}]}},"additionalProperties":false},"logicalName":"Proposal.Update","displayName":"Proposal.Update","title":"Proposal.Update","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"SmartMatch.Run","description":"Run a Smart Match ranking on an RFP or concise requirement brief. Use only when the role, must-have skills/outcomes, seniority, location/remote constraints, and timing are clear enough to match consultants; otherwise ask one clarifying question first. Returns the tuple ID + status; the ranking pipeline runs asynchronously and the UI follows the background job.","inputSchema":{"type":"object","required":["rfpText","title"],"properties":{"rfpText":{"type":"string"}},"additionalProperties":false},"logicalName":"SmartMatch.Run","displayName":"SmartMatch.Run","title":"SmartMatch.Run","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"SmartMatch.GetRanking","description":"Fetch a Smart Match ranking by tuple ID. Use only when the user explicitly asks for the latest result of an active Smart Match job. If complete, present the ranked consultants with scores, confidence, and evidence-grounded explanations. If pending or running, say the Smart Match card will update when the delegated job finishes.","inputSchema":{"type":"object","required":["tupleId"],"properties":{"tupleId":{"type":"string"}},"additionalProperties":false},"logicalName":"SmartMatch.GetRanking","displayName":"SmartMatch.GetRanking","title":"SmartMatch.GetRanking","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Teampitch&config=eyJ1cmwiOiAiaHR0cHM6Ly9hcGkudGVhbXBpdGNoLmFwcC9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Teampitch%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.teampitch.app%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Teampitch%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.teampitch.app%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Teampitch&connectorUrl=https%3A%2F%2Fapi.teampitch.app%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Teampitch\" --url \"https://api.teampitch.app/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/teampitch-mcp-12e619d2b2","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/teampitch-mcp-12e619d2b2/tools/{tool}","mcpServerUrl":"https://api.teampitch.app/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/teampitch-mcp-12e619d2b2?live=1"}