Skip to main content
Glama
borgels

mcp-server-productive

by borgels

mcp-server-productive

Productive.io API v2용 MCP 서버 — 한 조직의 프로젝트, 작업, 시간 추적, 리소스 계획, 재무, CRM 및 보고서를 다룹니다.

Productive는 132개 리소스에 걸쳐 약 650개의 작업을 제공합니다. 이를 650개의 MCP 도구로 바꾸면 어떤 클라이언트의 도구 목록도 압도하게 되므로, 이 서버는 생성된 레지스트리로 구동되는 열두 개의 도구로 구성됩니다. 도구는 범용적이며, 레지스트리가 각 리소스가 실제로 무엇을 받아들이는지 알고 있습니다.

도구

탐색 — productive_search_capabilities, productive_describe_resource, productive_check_connection, productive_describe_custom_fields

읽기 — productive_list (필터, 정렬, include, 페이지네이션, 그룹화가 포함된 26개 보고서 엔드포인트), productive_get

쓰기 — productive_create, productive_update, productive_delete, productive_run_action (보관, 복원, 승인, 마감, 복사, 확정, 전송 등 150개의 명명된 동사), productive_track_time, productive_commit_operation

사용자별 인증(선택) — productive_connect, productive_status, productive_disconnect — 인증 참조

productive_search_capabilities부터 시작하세요. Productive의 리소스 이름은 고유합니다. 예산은 deal이고, 보드 열은 workflow_status이며, 타임시트 승인은 time_entries에 있습니다. 추측은 호출 비용을 초래합니다.

Related MCP server: productive-mcp-rb2

레지스트리

src/productive/registry.generated.ts는 scripts/generate-registry.mjs가 Productive의 공개 OpenAPI 문서에서 생성한 것이며 커밋되어 있으므로, CI는 네트워크가 필요 없고 스펙 변경은 검토 가능한 diff로 나타납니다. 레지스트리는 모든 리소스에 대해 필터 필드, 정렬 키, 보고서 그룹 키, include 가능한 관계, 생성 및 업데이트 시 필수로 표시된 쓰기 가능 속성, 그리고 각 명명된 작업을 기록합니다.

그 덕분에 열두 개의 도구가 정직함을 유지할 수 있습니다. productive_describe_resource는 한 리소스에 대한 정확한 계약을 돌려주며, 모든 인자는 요청이 나가기 전에 그 계약과 대조 검사됩니다.

npm run registry:generate로 재생성합니다(로컬 스펙 사본을 사용하려면 경로 인자를 추가하세요). 수작업으로 작성된 분류 — 위험 등급, 외부 노출 플래그, 차단된 작업 — 가 스펙의 어떤 경로와도 더 이상 일치하지 않으면 생성기는 빌드를 실패시키므로, 업스트림의 이름 변경이 조용히 가드를 제거할 수 없습니다.

측정된 API 동작

여기의 모든 내용은 실제 조직에서 검증되었습니다. 스펙과 API가 중요한 부분에서 서로 다르기 때문입니다.

시간은 분 단위, 금액은 최소 화폐 단위입니다. 시간 항목 2는 2분입니다. 응답도 동일한 단위로 돌아옵니다.

알 수 없는 필터, 정렬, include는 크게 실패합니다. unsupported_filter, sort_param_unsupported, unsupported_include와 함께 HTTP 400이 반환됩니다. 따라서 여기서 검증하는 것은 안전망이 아니라 더 나은 오류입니다.

알 수 없는 쓰기 속성은 조용히 실패합니다. 오타가 있는 속성으로 PATCH를 보내면 HTTP 200이 반환되고 아무것도 변경되지 않습니다 — 성공과 구별할 수 없습니다. 따라서 이 서버는 리소스가 선언하지 않은 속성을 거부하며, 발생하지 않은 쓰기를 보고하지 않습니다. 이것이 레지스트리가 하는 가장 유용한 일입니다.

모든 필드에는 정확히 여섯 개의 필터 연산자가 있습니다: contains, eq, gt, lt, not_contain, not_eq. 스펙은 필드당 네 개만 나열하고 실제로 동작하는 gt/lt를 빠뜨립니다. gte, lte, in, not_in, starts_with, ends_with, blank, present는 모두 unsupported_filter_operation으로 거부됩니다. 포함 비교는 없으므로, 포함 범위가 필요하면 리소스 자체의 after/before 또는 <field>_after/<field>_before 필터 필드를 사용해야 합니다.

page[size]는 200에서 상한이 정해지며 조용히 잘립니다. 500을 요청하면 오류 없이 200이 반환됩니다. 결과에는 total과 nextPage가 포함되어 한 페이지가 전체 답으로 오인되지 않습니다.

PATCH는 진정한 부분 업데이트입니다. 생략된 속성은 값을 유지하므로 전체 레코드를 다시 보낼 필요가 없습니다.

data.type은 검사되지 않습니다. type: "projects"로 작업을 패치하면 성공하고 변경이 적용됩니다. 이 서버는 그래도 올바른 타입을 보냅니다.

조직 ID가 "제공되어야 한다"는 403은 누락이 아니라 잘못되었음을 의미할 수 있습니다. 동일한 no_organization_id 코드가 누락된 헤더와 토큰이 도달할 수 없는 조직을 모두 포함합니다.

누락된 기능은 403이 아니라 404로 응답합니다. /boards는 해당 기능이 없는 조직에서 404를 반환하며, 이는 경로가 깨진 것처럼 보입니다.

삭제는 복원 가능할 수 있습니다. 삭제된 작업은 item_type과 item_id와 함께 deleted_items에 나타나며 해당 리소스의 restore 작업을 통해 복원할 수 있습니다. 작업에 대해서만 검증되었으므로 모든 유형에 적용된다고 가정하지 마세요.

GET /users는 유일한 호출자 범위 엔드포인트입니다. 정확히 하나의 레코드 — 바로 사용자 — 를 반환하며, 이 서버가 토큰 소유자를 식별하는 방법입니다. /users/me는 존재하지 않으며 해당 경로는 404를 반환합니다. /organization_memberships에 주의하세요. 이는 고정된 조직으로 범위가 한정되지 않고 호출자가 속한 모든 조직에 걸친 멤버십을 나열하므로, 행 수가 인원수가 아닙니다.

속도 제한 헤더가 없습니다. x-request-id만 있으며, 이 서버의 오류가 이를 인용합니다. 한도를 탐색하지 말고 429에서 백오프하세요.

권한

기본적으로 모두 꺼져 있는 네 개의 스위치. 읽기 전용 서버가 유용하고 안전한 기본값입니다.

스위치

적용 범위

PRODUCTIVE_ENABLE_WRITES

마스터 스위치. 이 스위치 없이는 아무것도 변경되지 않습니다.

PRODUCTIVE_ENABLE_FINANCIALS

금전, 가격, 급여, 고객이 받는 문서: 인보이스, 라인 항목, 결제, 청구서, 비용, 구매 주문, 제안서, 계약서, 가격, 요금 카드, 급여, 간접비, 세율, 은행 계좌, 자회사.

PRODUCTIVE_ENABLE_ADMIN

접근 및 조직 전체 구성: 인력, 멤버십, 권한 집합, 팀, 초대, 사용자 정의 필드, 웹훅, 통합, 승인 및 시간 추적 정책.

PRODUCTIVE_ENABLE_DELETES

계층 게이트에 더해 삭제.

Productive에는 마스터 스위치 하나로는 충분하지 않습니다. 동일한 API가 작업을 이동하고, 인보이스를 발행하고, 권한 집합을 부여하는데, 이는 서로 다른 세 가지 결정입니다. 프로젝트 작업을 실행하도록 신뢰받은 서버가 그로 인해 인보이스를 보낼 수 있어서는 안 됩니다.

PRODUCTIVE_ALLOWED_RESOURCES / PRODUCTIVE_DENIED_RESOURCES는 인스턴스를 더 좁히며 읽기에도 적용됩니다. 시간 추적에만 범위가 한정된 인스턴스는 급여도 읽을 수 없어야 합니다.

스위치와 관계없이 절대 노출되지 않는 것: passwords, sessions, organization_subscriptions, 인증이 없는 public/* 공유 링크, 그리고 PATCH /users/{id}/update_password. 이들은 게이트로 차단되는 대신 레지스트리에서 아예 빠져 있으므로, 어떤 정책 버그도 이를 다시 열 수 없습니다.

2단계 쓰기

일반적인 프로젝트 작업 — 작업, 시간 항목, 예약, 댓글 — 은 한 번의 호출로 작성됩니다. 모든 시간 항목에 핸드셰이크를 요구하면 사람들이 가장 많이 하는 일에 서버를 사용할 수 없게 됩니다.

폭발 반경이 더 넓은 모든 것은 스테이징됩니다. 도구는 정확한 요청과 해시를 반환하고 아무것도 보내지 않으며, productive_commit_operation은 작업이 변경되지 않은 채로 돌아올 때만 실행합니다. 여기에는 재무 및 관리 계층, 모든 삭제, 조직을 떠나는 모든 것, 그리고 모든 bulk_* 작업이 포함됩니다. 이 작업들은 필터가 일치하는 모든 레코드에 적용되므로 명시적 필터 없이는 실행을 거부합니다.

여섯 개의 작업은 실행되는 순간 조직 외부의 누군가에게 도달하기 때문에 outward로 표시됩니다: invoices.send, invoices.send_einvoice, people.invite, people.resend, organizations.resend_code, 그리고 invitation 생성.

인증

두 가지 모드. PRODUCTIVE_ORGANIZATION_ID는 두 모드 모두에서 필수이며 도구 인자로 사용되지 않습니다.

사용자별 토큰(권장)

각 개인은 자신의 Productive 토큰을 연결하므로, Productive가 그들의 권한을 적용하고 그들이 한 일에 이름을 기록합니다.

이것은 대부분의 시스템보다 Productive에서 더 중요합니다. Productive는 작업을 사람에게 귀속시킵니다. 시간 항목은 person_id에 속하며, 모든 변경은 활동 로그에 토큰 소유자로 기록됩니다. 이 로그는 고객 인보이스를 방어하는 근거가 됩니다. 하나의 공유 토큰을 사용하면 그 로그는 서비스 계정이 모든 것을 했다고 표시됩니다.

PRODUCTIVE_PER_USER_AUTH=true
PRODUCTIVE_TRUST_FORWARDED_USER=true
PRODUCTIVE_ENCRYPTION_KEY=<min 16 chars>
PRODUCTIVE_STORE_PATH=/data/store.json
PRODUCTIVE_PUBLIC_BASE_URL=https://productive.example.com
# PRODUCTIVE_API_TOKEN deliberately unset

절차:

  1. 호출자가 productive_connect를 실행하면 10분간 유효한 일회용 링크를 받으며, 이는 호출자의 신원에 바인딩됩니다.

  2. 링크를 열고 Productive의 설정 → API 통합에서 만든 토큰을 붙여넣습니다. 토큰은 브라우저에서 서버로 직접 전달되므로 대화 기록에 들어가지 않습니다. Productive 토큰은 전체 계정과 동등한 bearer 자격이며, 아래에서 측정한 대로 일반적으로 둘 이상의 조직에 도달합니다.

  3. 저장하기 전에 서버는 해당 토큰과 이 조직의 ID로 GET /users를 호출합니다. 한 번의 호출로 세 가지를 증명합니다: 토큰이 유효하고, 이 조직에 도달할 수 있으며, 누구의 것인지. 그런 다음 페이지에서 어떤 계정이 연결되었는지 확인합니다.

  4. 토큰은 AES-256-GCM으로 저장 시 암호화되며, 검증된 신원당 한 행씩 저장됩니다.

주의할 점:

  • 신원은 게이트웨이에서만 얻습니다. X-MCP-User는 PRODUCTIVE_TRUST_FORWARDED_USER=true일 때만 읽히며, MCP 클라이언트가 제어하는 어떤 것에서도 읽히지 않습니다. 검증된 토큰에서 헤더를 설정하고 클라이언트가 제공한 사본을 제거하는 게이트웨이 뒤에서만 활성화하세요. 그렇지 않으면 호출자가 아무 신원이나 지정하고 그 사람으로 행동할 수 있습니다.

  • 폴백이 없습니다. 등록되지 않은 호출자는 PRODUCTIVE_API_TOKEN이 설정되어 있어도 공유 토큰이 아닌 NOT_CONNECTED를 받습니다. 폴백은 빌린 권한을 넘겨주는 것이며, 이 모드가 제거하려는 바로 그 실패입니다.

  • /productive/enroll은 사용자의 브라우저가 접근할 수 있어야 하며, MCP 게이트웨이를 우회해야 합니다. 브라우저는 게이트웨이의 bearer 토큰을 전달할 수 없습니다. PRODUCTIVE_PUBLIC_BASE_URL의 /productive/*를 컨테이너로 직접 라우팅하세요. 그 보안은 일회용이고 신원에 바인딩된 상태 토큰입니다.

  • PRODUCTIVE_STORE_PATH를 볼륨에 유지하고 PRODUCTIVE_ENCRYPTION_KEY를 안정적으로 유지하세요. 변경하면 저장된 모든 토큰을 복호화할 수 없게 됩니다.

  • 토큰 자체의 Productive 이메일이 호출자의 디렉터리 주소와 다른 경우, 페이지와 productive_status에서 크게 보고되고 그래도 연결됩니다. 대신 거부하려면 PRODUCTIVE_REQUIRE_EMAIL_MATCH=true를 설정하세요. 다른 사람의 토큰을 붙여넣는 사람은 이미 그 토큰을 보유하고 있으므로 거부해도 보안상 얻는 것이 거의 없고, 다른 주소의 Productive 계정은 충분히 있을 법한 일이기 때문에 기본값은 꺼져 있습니다.

  • 사용자별 인증은 권한과 귀속을 분리하지, 조직을 분리하지 않습니다. 조직 고정은 여전히 모든 사람에게 적용됩니다.

공유 토큰

PRODUCTIVE_API_TOKEN을 하나의 토큰으로 설정하세요. 간단하며 stdio나 단일 운영자에게 적합합니다. 하지만 모든 호출자가 그 토큰 소유자로 행동하며, 그들의 권한을 사용하고, Productive의 활동 로그는 모든 변경을 그 사람에게 귀속시킵니다.

PRODUCTIVE_TRUST_FORWARDED_USER는 여기서도 여전히 유용합니다: 사람 형태의 쓰기(시간 항목, 예약)는 토큰 소유자가 아니라 확인된 호출자로 기본 설정되며, 서버는 주소가 아무도 또는 두 명 이상의 사람과 일치할 때 추측하기를 거부합니다. productive_check_connection은 어느 쪽이든 토큰 소유자를 명명하므로 귀속이 놀라운 일이 되지 않습니다.

다중 조직

하나의 인스턴스는 정확히 하나의 조직만 서비스합니다. X-Organization-Id는 환경에서 가져오며 도구 인수가 아니므로, 어떤 코드 경로도 — 일반 도구를 포함해서 — 다른 테넌트에 도달할 수 없습니다. 두 번째 조직을 위해 두 번째 인스턴스를 실행하세요. 이미지는 동일합니다.

이것은 이론적인 이야기가 아닙니다. 단일 토큰이 여러 조직에 정기적으로 도달합니다. 이 서버를 개발할 때 사용한 계정에서 GET /organizations는 세 개를 반환했고, 헤더만 바꿔도 그 사이를 이동했습니다(나머지 두 개는 "찾을 수 없음"이 아닌 403 subscription_expired로 응답했습니다). 헤더가 경계의 전부이므로, 인수로 전달되는 대신 고정되는 것이며, 등록된 사용자별 토큰이 저장되기 전에 이 조직에 대해 검증되는 이유이기도 합니다.

구성

.env.example을 참조하세요. 필수 변수 두 개는 PRODUCTIVE_API_TOKEN(Productive의 Settings → API integrations; 생성 사용자의 권한을 상속함)과 PRODUCTIVE_ORGANIZATION_ID(Productive URL의 숫자 ID)입니다.

PRODUCTIVE_AUDIT_LOG를 설정하면 정책이 거부한 시도까지 포함하여 변경 시도마다 JSON 줄 하나를 추가합니다. 요청 본문은 의도적으로 기록하지 않습니다. 요청 본문에는 급여, 요율, 개인 데이터가 담겨 있으며, 원본 시스템만큼 엄격히 보호해야 하는 감사 추적은 좀처럼 읽히지 않기 때문입니다.

실행

npm install
npm run dev          # stdio
npm run dev:http     # streamable HTTP on :3000/mcp (stateless), /healthz open
npm test
npm run smoke:live   # reads a real organization; stages one write, commits nothing

Docker 이미지: ghcr.io/borgels/mcp-server-productive(main에 푸시할 때 게시됨).

라이선스

Apache-2.0.

Available Tools

12 tools
productive_check_connectionCheck connectionA
Read-only

Verify the token and organization and report what this deployment may do. Also names the person the token belongs to — every change Productive records is credited to them, whoever asked — and the caller identity, when a gateway forwards one.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals safety, and the description adds relevant behavioral context: token identity is attributed to every recorded change, and caller identity may be forwarded by a gateway. This goes beyond the annotation without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with the core action first, followed only by consequential detail about attribution and caller identity. There is no fluff or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless tool, the description conveys the main outputs: deployment capabilities, token owner, and caller identity. It does not specify exact response formatting or failure behavior, but the tool's simplicity and readOnly annotation make this a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the empty schema fully describes the input surface, so there is nothing for the description to add about parameter semantics. The baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Verify the token and organization' and states what the tool reports (deployment capabilities, token owner, caller identity). This makes its role distinct from sibling data-operation tools like productive_get or productive_create.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes the context — validating the Productive token and organization and surfacing what the deployment can do — so an agent knows to call it for connection/auth checks. It does not explicitly name alternatives or when-not conditions, but the absence of parameters and the verification purpose make the intended use obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_commit_operationCommit a staged operationA

Execute a write that a prepare step staged. Pass the operation object back exactly as it was returned: it is hashed, and an altered operation is refused rather than run. Show the change to the person who asked for it before committing.

NameRequiredDescriptionDefault
operationYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the minimal readOnlyHint=false annotation, the description discloses two important behaviors: the operation is hashed and altered operations are refused, and the change must be shown to the requester before committing. This is valuable safety-relevant context for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, purposeful sentences with no fluff. Purpose, usage constraint, and mandatory approval step are all front-loaded and directly actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what matters most for a commit operation: exact object reuse, hash enforcement, and user approval. It does not describe the success response or explicitly name a prepare tool, but the workflow is sufficiently constrained for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the single nested 'operation' parameter has no field-level documentation. However, the description compensates by instructing the agent to pass the exact object back and explaining the hash invariant, which materially reduces the risk of misuse despite lacking field-by-field semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: 'Execute a write that a prepare step staged.' This clearly identifies the tool as the commit step for a staged operation, distinguishing it from direct create/update/delete siblings by the staged-operation framing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: use after a prepare step, pass the operation object back exactly as returned, and show the change before committing. It does not explicitly name alternatives or say when not to use it, but the staged-operation workflow is unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_createCreate a recordA

Create a record on any writable resource. Required attributes are checked first, and so is every attribute name. On a financial or administrative resource this returns a staged operation to review rather than creating anything — pass it to productive_commit_operation to go through with it.

NameRequiredDescriptionDefault
resourceYes
attributesNoAttributes to write, by their Productive names. Validated against the resource contract first, because Productive answers 200 and ignores an unknown attribute rather than reporting it. Custom-field values go in a nested `custom_fields` object keyed by field id.
relationshipsNoJSON:API relationships, where the resource accepts them. Most links are set through an `_id` attribute instead.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only mark readOnlyHint=false, so the description carries the burden of explaining mutation nuance. It discloses the staging behavior, the validation-before-write behavior, and the fact that commit is required on certain resources. This is meaningful behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler, with the core action first, then validation, then the exception case. Every sentence adds actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with no output schema, it explains the essential invocation path, including when commit is required. It could say more about return shape or failure behavior, but the description and schema together cover the necessary details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes attributes and relationships in detail, covering 2 of 3 parameters. The tool-level description adds no parameter-specific detail; `resource` remains minimally described, though it is self-evident and explained at a high level as 'any writable resource.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States exactly what it does: create a record on any writable resource. The explicit mention of productive_commit_operation distinguishes it from update/delete/list/get siblings. No ambiguity about the operation performed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the resource-type condition that changes behavior: financial/administrative resources stage an operation rather than creating, and directs the agent to productive_commit_operation to finalize. It doesn't enumerate exclusions versus update/delete, but for a create tool this is sufficient guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_deleteDelete a recordA
Destructive

Delete a record. Needs its own switch beyond ordinary writes, and always returns a staged operation first. Many Productive types are meant to be archived rather than deleted — check productive_describe_resource for an archive action before reaching for this.

NameRequiredDescriptionDefault
idYes
resourceYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description need not restate that. It adds non-obvious behavioral facts: deletion requires a separate switch and always returns a staged operation first. This goes beyond annotations and meaningfully sets expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences with the core purpose first, followed by two high-value caveats. Every sentence earns its place; there is no filler or repetition of schema/annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with two simple parameters and no output schema, the description provides essential behavior: staged operation first, archive exception, and switch requirement. The main gap is parameter semantics, but the operational guidance is strong enough to make the tool safely invocable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not define the `resource` or `id` parameters. 'Delete a record' hints that resource is the record type and id is its identifier, but this is too vague to clarify valid resource types or how the id is used. The description adds minimal value beyond the parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Delete') and resource ('a record'), making the tool's purpose clear. It also distinguishes the tool from create/update operations and explicitly references the archive alternative, differentiating it from a sibling behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs the agent to check productive_describe_resource for an `archive` action before using delete, giving clear when-to-use-vs-alternative guidance. It also notes the requirement for a special switch beyond ordinary writes, which is a practical precondition for invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_describe_custom_fieldsDescribe custom fieldsA
Read-only

List the organization's custom fields with the id each value is written under, the object it applies to, and its options. Custom-field values are keyed by numeric id, not by display name — a name used as a key is accepted with 200 and stored nowhere.

NameRequiredDescriptionDefault
appliesToNoNarrow to fields on one object, matched against Productive's own wording for it. That wording is not this server's resource key — fields on people report "employees" — so call this without an argument first and pick from appliesToValues.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses a critical behavioral quirk: custom-field values are keyed by numeric id, not display name, and using a name as a key is silently accepted with 200 but stored nowhere. This is exactly the kind of non-obvious behavior that prevents an agent from making a subtle mistake.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the purpose and return fields, then adds the essential behavior warning. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only listing tool with one optional parameter, the description is complete: it names the resource, lists the output components, and flags the keying gotcha. The absence of an output schema is mitigated by the explicit statement of what is returned, and the readOnlyHint annotation covers safety expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage and already explains appliesTo in detail, including the 'employees' example and the instruction to call without an argument first. The tool description itself adds no additional parameter semantics beyond the schema, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List'), names the resource ('organization's custom fields'), and specifies what is returned: id, object, and options. It clearly distinguishes this from siblings like productive_describe_resource, which would describe a resource's schema rather than enumerate custom fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its usage context clearly: call it to list custom fields and understand how values are keyed. The input schema adds explicit guidance to call without an argument first and then pick from appliesToValues, which is practical usage direction. It does not explicitly name alternative tools or state when not to use it, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_describe_resourceDescribe a resourceA
Read-only

The exact contract for one resource, derived from Productive's own OpenAPI document: every filter field, the operators any field accepts, sort keys, report group keys, includable relationships, the writable attributes for create and update with the required ones marked, and any named actions. Read this before writing — it is the difference between a write that lands and a 200 that changed nothing.

NameRequiredDescriptionDefault
resourceYesResource key, e.g. "tasks", "time_entries", "reports/time_reports".

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds valuable behavioral context: output is derived from Productive's own OpenAPI document and includes specific contract elements, plus a warning about write no-ops that goes beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: one sentence enumerates the full contract contents, and a second short sentence delivers a high-impact usage warning. Every phrase contributes meaning, with no filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read-only introspection tool, the description fully specifies what output the agent should expect and when to call it. The lack of an output schema is compensated by the detailed enumeration of returned contract components.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents the single 'resource' parameter with examples. The description adds no additional syntax, validation, or format details for the parameter, so it stays at the baseline where the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb-object relationship: it provides 'the exact contract for one resource' and enumerates the concrete contents such as filter fields, operators, sort keys, and writable attributes. This clearly distinguishes it from siblings like productive_get, productive_list, and productive_describe_custom_fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to 'Read this before writing' and contrasts a successful write with 'a 200 that changed nothing,' giving a clear trigger for use. It does not explicitly name alternative tools or when not to use it, but the intended context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_getGet one recordA
Read-only

Read one record by id, optionally pulling related records in the same call rather than following relationship stubs one at a time.

NameRequiredDescriptionDefault
idYes
rawNo
includeNo
resourceYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes safety, and the description adds meaningful behavior: optional eager-loading of related records in the same call. It does not explain raw mode or default include behavior, but the core read semantics are transparent and align with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the core purpose and then adds the key optional behavior. There is no redundant or filler language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no parameter descriptions, the description is too sparse to fully support correct invocation. The agent still has to guess what 'resource' values are valid, what 'raw' does, and what the response shape looks like. The relationship-include guidance is helpful but not enough.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for all four parameters. It explains the purpose of 'id' and loosely hints at 'include', but it never clarifies 'resource' or 'raw', which are both undocumented in the schema and the description. This is a significant gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Read') and clear object ('one record by id'), which distinguishes it from sibling tools like productive_list and productive_create. The added phrase about pulling related records also separates it from naive relationship-stub traversal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys when to use the tool: when you need a single record by id and optionally want related records in one call rather than following stubs. It does not explicitly exclude alternatives like productive_list for multiple records, so it stops short of full when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_listList recordsA
Read-only

List any Productive resource with server-side filtering, sorting, includes and paging. Also how the 26 report endpoints are read: use resource "reports/time_reports" (and the rest) with group to get aggregated rows instead of records. Results are flattened out of JSON:API — attributes hoisted, included records inlined into their relationship — with total and nextPage so a page is never mistaken for the whole answer.

NameRequiredDescriptionDefault
rawNoReturn Productive's JSON:API envelope untouched instead of flat records.
pageNo
sortNoSort keys; prefix with "-" for descending, e.g. ["-created_at"].
groupNoReport aggregation key. Only the reports/* resources accept one.
filtersNoServer-side filters. A bare value means equality: {"assignee_id":"5"}. An array is comma-joined: {"id":["1","2"]}. An operator object narrows further: {"created_at":{"gt":"2026-01-01"}} — the ONLY operators Productive accepts are contains, eq, gt, lt, not_contain, not_eq. There is no gte/lte, so for an inclusive date range use the resource's own after/before filter fields instead. Logical groups nest: {"$op":"and","0":{"assignee_id":{"eq":"5"}},"1":{"company_id":{"eq":"7"}}}. Field names are validated against the resource — call productive_describe_resource for the list.
includeNoRelationships to pull in the same call, e.g. ["assignee","project"].
resourceYesOne of 132 resource keys; see productive_search_capabilities.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral detail beyond the readOnlyHint annotation: results are flattened out of JSON:API, attributes are hoisted, included records are inlined, and responses include total and nextPage so the agent understands pagination is partial. It also clarifies that report resources return aggregated rows rather than records. This goes well beyond the minimal safety signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at three sentences and front-loads the core purpose. Each sentence provides meaningful information, though the phrase 'Also how the 26 report endpoints are read' is slightly awkward and could be streamlined. Overall it is efficient without unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains the return shape well: flattened records, inlined relationships, total, and nextPage. It also covers the special report behavior and aggregated rows. For a complex 7-parameter listing tool with 132 possible resources, this is sufficiently complete to guide correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, so the input schema already documents most parameters well. The description adds a little context around group for report endpoints, but it mostly summarizes capabilities like filtering and paging rather than meaningfully extending the schema's parameter documentation. Baseline 3 is appropriate because the schema carries the parameter-semantic burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists any Productive resource with filtering, sorting, includes, and paging. It also explicitly handles the special behavior of the 26 report endpoints, distinguishing this from siblings like productive_get and productive_search_capabilities. The verb 'List' and resource scope are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear guidance on when to use this tool, including the specific instruction to use resource 'reports/time_reports' with group for aggregated report rows. It provides the main usage context but does not explicitly enumerate exclusions or alternatives such as 'use productive_get for a single record.' The context is clear enough that an agent can choose correctly in most cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_run_actionRun a named actionA

Run one of Productive's named verbs: archive, restore, close, open, approve, reject, copy, finalize, send, reposition and the rest. Actions named bulk_* act on every record the filter matches rather than one, and refuse to run without an explicit filter. productive_describe_resource lists the actions a resource has.

NameRequiredDescriptionDefault
idNoRequired for actions that act on one record.
actionYesAction name, e.g. "archive", "approve", "send".
filtersNoServer-side filters. A bare value means equality: {"assignee_id":"5"}. An array is comma-joined: {"id":["1","2"]}. An operator object narrows further: {"created_at":{"gt":"2026-01-01"}} — the ONLY operators Productive accepts are contains, eq, gt, lt, not_contain, not_eq. There is no gte/lte, so for an inclusive date range use the resource's own after/before filter fields instead. Logical groups nest: {"$op":"and","0":{"assignee_id":{"eq":"5"}},"1":{"company_id":{"eq":"7"}}}. Field names are validated against the resource — call productive_describe_resource for the list.
resourceYes
attributesNoAttributes to write, by their Productive names. Validated against the resource contract first, because Productive answers 200 and ignores an unknown attribute rather than reporting it. Custom-field values go in a nested `custom_fields` object keyed by field id.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only provide readOnlyHint=false, so the description carries the behavioral burden. It discloses two non-obvious behaviors: bulk_* actions operate on every record the filter matches, and they refuse to run without an explicit filter. The schema also surfaces that Productive answers 200 and silently ignores unknown attributes, adding important behavioral context beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the core purpose, then immediately covers the most dangerous edge cases (bulk scope and filter requirement), and ends with a useful discovery pointer. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 5-parameter tool with nested filter objects and no output schema, the description and schema together cover the essential invocation details: valid action classes, bulk semantics, filter requirements, field validation, and discovery via productive_describe_resource. The only notable gap is the lack of any mention of what the response looks like or error behavior beyond the silent-attribute-ignore note, which is a minor omission for an action-triggering tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is roughly 80%, and the schema already provides rich semantics for filters, attributes, and id. The description adds the bulk-vs-single distinction and the explicit-filter requirement, which complements the filters parameter. Given this high schema coverage, the baseline of 3 is appropriate; the description does not need to re-document each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Run') and a clear resource class ('one of Productive's named verbs'), then lists concrete examples: archive, restore, close, open, approve, reject, copy, finalize, send, reposition. It also distinguishes single-record actions from bulk_* actions, so the tool's purpose is unmistakable and well differentiated from the sibling CRUD tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states that bulk_* actions require an explicit filter and calls out productive_describe_resource as the way to discover which actions a resource supports. It does not, however, give explicit when-not-to-use guidance against siblings like productive_update or productive_delete, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_search_capabilitiesSearch capabilitiesA
Read-only

Find the right resource, tool or guide for a subject. Start here: Productive names its resources its own way (a budget is a deal, a person is a person, a board column is a workflow_status), and guessing wastes calls. Returns matching tools, workflow guides, and resources with the operations each supports.

NameRequiredDescriptionDefault
limitNo
queryYesSubject to search for, e.g. "invoice", "capacity", "custom field", "time".

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint=true already in annotations, the description adds useful behavioral context: it returns matching tools, workflow guides, and resources along with the operations they support. It also discloses the important quirk that resource names may not match user expectations. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose, and every sentence adds value: what it finds, where to start, and what it returns. The naming examples are illustrative without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with only two parameters and no output schema, the description covers purpose, scoping context, and return categories well. It does not detail result shape or empty-result behavior, but those are not critical for selecting and invoking this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description reinforces that 'query' is a subject to search for, but the schema already covers that with examples. The 'limit' parameter is not described in the description, and with only 50% schema description coverage, the description does not fully compensate. The parameter is simple enough that the gap is moderate rather than severe.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Find') and resource ('resource, tool or guide for a subject') and clearly distinguishes this as the starting point for discovery. It explains the tool's role relative to siblings by highlighting Productive's naming conventions, so an agent knows this is a search/capability lookup, not a data operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Start here' explicitly tells the agent when to use this tool, and the mention of Productive's non-obvious naming ('a budget is a deal') explains why guessing would waste calls. It does not name alternative sibling tools or state when not to use it, but the contextual guidance is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_track_timeTrack timeA

Log a time entry without looking up what Productive insists on. Time is stored in MINUTES — pass hours and it converts. The service (the budget line the work bills to, not the task) is resolved from the task when not given, and the person is resolved from the authenticated caller, so time lands on the right person even though the server holds one shared token.

NameRequiredDescriptionDefault
dateYesDate of the work, YYYY-MM-DD.
noteNo
hoursNoTime worked in hours; converted to minutes.
taskIdNoTask worked on. Also used to resolve the service.
minutesNoTime worked, in minutes.
personIdNoWhose time this is. Defaults to the resolved caller.
serviceIdNoService (budget line) to bill to; overrides the task lookup.
billableMinutesNoBillable portion, if it differs from the time worked.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=false in annotations, the description carries the full burden of behavioral disclosure. It clearly reveals that hours are converted to minutes, the service is derived from the task when absent, and the person is resolved from the authenticated caller despite a shared server token. This is specific and valuable transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the first states the action, the second explains the critical unit conversion, and the third clarifies lookup defaults and authentication behavior. It is dense without being bloated, and the essential action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with no output schema, the description covers the core call flow well: what to log, how units are handled, which IDs can be omitted, and how resolution works. It does not describe the return value or what happens when conflicting inputs like hours and minutes are both supplied, but these are minor gaps given how much is already explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 88%, so the schema already documents most parameters. The description adds real value by explaining the hours-to-minutes conversion, the distinction between service and task, and the fallback resolution behavior for serviceId and personId. It does not explain every edge case, such as providing both hours and minutes, but it meaningfully supplements the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Log a time entry.' It goes beyond the title by explaining the key behavior that makes this tool distinct from generic create/list tools: it avoids manual lookups and handles conversions, making the intent unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear practical context: service can be omitted and is resolved from the task, person can be omitted and is resolved from the caller. This tells an agent when it can avoid passing certain parameters, though it does not explicitly name alternatives or state when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

productive_updateUpdate a recordA

Update a record. PATCH semantics, verified live: attributes you omit keep their values, so there is no need to resend the whole record. On a financial or administrative resource this returns a staged operation instead of writing.

NameRequiredDescriptionDefault
idYes
resourceYes
attributesNoAttributes to write, by their Productive names. Validated against the resource contract first, because Productive answers 200 and ignores an unknown attribute rather than reporting it. Custom-field values go in a nested `custom_fields` object keyed by field id.
relationshipsNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With only readOnlyHint=false provided by annotations, the description carries a meaningful behavioral burden and does well: it discloses PATCH semantics, confirms omitted fields are retained, and warns that certain resources return a staged operation instead of writing. It does not cover permissions or reversibility, but it adds real behavioral facts beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded with the key PATCH behavior. The first sentence duplicates the title, which costs a little, but every other sentence carries useful operational meaning without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers core PATCH semantics and the staged-operation caveat, but it does not explain what a staged operation should be followed by, especially given the sibling productive_commit_operation. There is also no output schema and the description does not say what a normal update returns, and relationships remain undocumented. This leaves the agent needing to infer important follow-up behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is low at 25%, and the description does add value for the attributes parameter by explaining that omitted attributes keep their values. However, it gives no semantic guidance for resource, id, or relationships, and the custom_fields nesting behavior lives only in the schema, not the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action on a record and immediately clarifies PATCH semantics, which distinguishes it from read-only siblings like productive_get and productive_list. It is slightly repetitive with the title but unambiguous about the operation's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context: partial updates preserve omitted attributes, so no full resend is needed, and financial/admin resources return staged operations instead of writing. However, it does not explicitly say when to choose this over productive_create, productive_delete, or productive_run_action, so usage versus alternatives is mostly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.2.0
    • First observedproductive_check_connection
    • First observedproductive_commit_operation
    • First observedproductive_create
    • First observedproductive_delete
    • First observedproductive_describe_custom_fields
    • First observedproductive_describe_resource
    • First observedproductive_get
    • First observedproductive_list
    • First observedproductive_run_action
    • First observedproductive_search_capabilities
    • First observedproductive_track_time
    • First observedproductive_update

TDQS

A4.3/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct operation: reading one record, listing, creating, updating, deleting, running a named action, staging/committing writes, tracking time, or performing a meta/introspection task. Even the closer pairs like get/list and describe_resource/describe_custom_fields are clearly separated by resource scope and purpose.

Naming Consistency5/5

All tools follow the snake_case productive_<verb> pattern, with most using verb_noun (productive_check_connection, productive_run_action) and a few using bare verbs (productive_get, productive_list). This is consistent and predictable, with no style mixing or vague duplicate verbs.

Tool Count5/5

Twelve tools is well within the ideal scope for a broad API integration server. The set covers generic CRUD, named actions, time tracking, staged writes, and meta/discovery tools without ballooning into redundant or overly granular endpoints.

Completeness5/5

The server provides full lifecycle coverage: read, list, create, update, delete, run actions, and commit staged operations, plus support for custom fields and resource contracts. The meta tools fill the gaps that typically cause agent failures, such as knowing resource-specific filters, writable attributes, and custom-field keying.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers