Skip to main content
Glama
expel-io

Atlassian Goals MCP Server

by expel-io

Atlassian Goals MCP Server

A Model Context Protocol (MCP) server for the Atlassian Goals API. Enables AI assistants like Claude to query, search, and update Atlassian Goals and Projects.

Features

Goals — Read

  • List, get (single or batch), and search goals via TQL (Townsquare Query Language)

Projects — Read

  • List, get (single or batch), and search projects via TQL

Goals — Write

  • Post weekly status updates (with summary, More detail, status/score, target date, and metric values)

  • Edit or delete the most recent update

  • Update goal metadata (name, description, owner, target/start date, archive flag)

  • Add or remove goal tags by name

Operational

  • Health check for API connectivity and authentication

  • Security: TQL injection prevention, input validation, request timeouts, retry with exponential backoff

  • Performance: rate limiting, automatic throttling, structured logging

  • Robustness: enhanced ADF parser supporting 15+ node types; markdown→ADF conversion for write fields

Related MCP server: MCP Jira & Confluence Server

Prerequisites

  • Node.js >= 18.0.0 (comes with Claude Desktop)

  • Atlassian Cloud account with Goals access

  • Atlassian API token

Quick Start

1. Get Your Atlassian Credentials

You'll need these four values:

  • Email: Your Atlassian account email

  • API Token: Generate at https://id.atlassian.com/manage-profile/security/api-tokens

  • Cloud ID: Visit https://your-company.atlassian.net/_edge/tenant_info (replace your-company with your subdomain) and copy the cloudId value

  • Site URL: Your Atlassian site URL (e.g., https://your-company.atlassian.net)

2. Add to Claude Desktop

Open your Claude Desktop config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Add this configuration (replace the placeholder values with your credentials from step 1):

{
  "mcpServers": {
    "atlassian-goals": {
      "command": "npx",
      "args": ["-y", "github:expel-io/atlassian-goals-mcp"],
      "env": {
        "ATLASSIAN_EMAIL": "your-email@example.com",
        "ATLASSIAN_API_TOKEN": "your-api-token",
        "ATLASSIAN_CLOUD_ID": "your-cloud-id",
        "ATLASSIAN_SITE_URL": "https://your-subdomain.atlassian.net"
      }
    }
  }
}

3. Restart Claude Desktop

Restart Claude Desktop to load the MCP server.

That's it! You can now ask Claude about your Atlassian Goals.

Local Development

If you want to modify or contribute to this server:

  1. Clone and build:

git clone https://github.com/expel-io/atlassian-goals-mcp.git
cd atlassian-goals-mcp
npm install
npm run build
  1. Update your Claude Desktop config to use the local build:

{
  "mcpServers": {
    "atlassian-goals": {
      "command": "node",
      "args": ["/absolute/path/to/atlassian-goals-mcp/build/index.js"],
      "env": {
        "ATLASSIAN_EMAIL": "your-email@example.com",
        "ATLASSIAN_API_TOKEN": "your-api-token",
        "ATLASSIAN_CLOUD_ID": "your-cloud-id",
        "ATLASSIAN_SITE_URL": "https://your-subdomain.atlassian.net"
      }
    }
  }
}
  1. Optionally create a .env file for testing:

cp .env.example .env
# Edit .env with your credentials

Available Tools

Tools are grouped by surface area. All goal/update IDs are Atlassian ARIs (e.g. ari:cloud:townsquare:{cloudId}:goal/{uuid}); the formats are validated by each tool's input schema.

Goals — Read

list_goals

List goals with optional filtering by status, name, or tags. Supports cursor-based pagination.

Parameters:

  • limit (optional): 1–100, default 20

  • status (optional): one of NOT_STARTED, IN_PROGRESS, COMPLETED, CANCELLED

  • searchTerm (optional): partial-match filter on goal name

  • tags (optional): array of tag names; multiple tags AND together

  • cursor (optional): pagination cursor from a previous response

get_goal

Fetch a single goal with description, owner, metrics, parent/sub-goal relationships, tags, and recent updates.

Parameters:

  • goalId (required): goal ARI

get_goals

Batch-fetch multiple goals in one request. More efficient than calling get_goal repeatedly.

Parameters:

  • goalIds (required): array of goal ARIs (1–20)

search_goals

Search goals using TQL (Townsquare Query Language).

Operators: LIKE (partial, supports _ as a single-character wildcard), = (exact), AND, OR. Fields: name, status (pending / on_track / at_risk / off_track / done / cancelled), owner (account ID), tag.

Parameters:

  • searchString (required): a TQL query, e.g. name LIKE "Q4" AND status = on_track

  • limit (optional): 1–100, default 20

  • cursor (optional): pagination cursor

Projects — Read

list_projects

List projects with optional name filtering and cursor pagination.

Parameters:

  • limit (optional): 1–100, default 20

  • searchTerm (optional): partial-match filter on project name

  • cursor (optional): pagination cursor

get_project

Fetch a single project with description, owner, members, linked goals, and recent updates.

Parameters:

  • projectId (required): project ARI (ari:cloud:townsquare:{cloudId}:project/{uuid})

get_projects

Batch-fetch multiple projects (1–20 per call).

Parameters:

  • projectIds (required): array of project ARIs

search_projects

Search projects using TQL. Currently supports LIKE on name with OR.

Parameters:

  • searchString (required): TQL query, e.g. name LIKE "Integration"

  • limit (optional): 1–100, default 20

  • cursor (optional): pagination cursor

Goals — Write

post_goal_update

Post a weekly status update — the entry that appears in the goal's Updates tab.

Status/score model: on_track/at_risk/off_track are derived from a 1–100 integer score (the Atlassian UI labels these as decimals like "0.8", but the API stores integers). Bands: 10–30 = off_track, 40–60 = at_risk, 70–100 = on_track. Status alone fills the band midpoint; score alone infers status; combined values are validated. pending/paused/done/cancelled/archived take only status — no score.

Markdown is supported in both summary and details and is converted to ADF before send.

Parameters:

  • goalId (required): goal ARI

  • summary (required): the visible headline, max 280 chars

  • details (optional): longer-form "More detail" body (no length limit)

  • status (optional): see above

  • score (optional): integer 1–100

  • targetDate (optional): { date: "YYYY-MM-DD", confidence?: "EXACT"|"QUARTER"|"HALF"|"YEAR" }

  • metricUpdates (optional): [{ targetId, value }]targetId is the metric target ID from get_goal

  • dryRun (optional): return the resolved mutation payload without submitting

edit_goal_update

Edit a previously-posted update. Partial fields are supported; at least one editable field is required.

Both goalId and goalUpdateId are required so the tool can pre-query existing update notes and pass updateNoteId when replacing details — without it, Townsquare appends a second note that the UI doesn't render.

Note the metric-input asymmetry with post_goal_update: metricUpdates takes metricId (the metric itself), not targetId (the metric target).

Parameters:

  • goalId (required): goal ARI

  • goalUpdateId (required): update ARI (ari:cloud:townsquare:{cloudId}:goal-update/{uuid})

  • summary, details, status, score, targetDate (all optional): same as post_goal_update

  • metricUpdates (optional): [{ metricId, value }]

  • dryRun (optional)

delete_latest_goal_update

Remove the most recent update on a goal. The Townsquare API only deletes the latest update per goal; earlier updates cannot be removed this way.

Parameters:

  • goalUpdateId (required): update ARI; must be the latest on its goal

  • dryRun (optional)

update_goal

Edit a goal's metadata. Status changes are NOT done here — use post_goal_update. Tags are also separate — use add_goal_tags / remove_goal_tags.

description accepts markdown and is converted to ADF. archived: true archives the goal (destructive in effect — confirm with the user before flipping on a real goal).

Parameters:

  • goalId (required): goal ARI

  • name (optional): new goal name

  • description (optional): markdown

  • ownerId (optional): Atlassian account ID (the value get_goal returns as owner.accountId)

  • targetDate (optional): { date, confidence? }

  • startDate (optional): YYYY-MM-DD

  • archived (optional): boolean

  • dryRun (optional)

At least one editable field is required.

add_goal_tags

Attach tags to a goal by name. Tag names that don't yet exist at the workspace level are auto-created — the Townsquare API does not expose a delete-tag mutation, so prefer reusing existing names over inventing new ones.

Parameters:

  • goalId (required): goal ARI

  • tagNames (required): array of tag names (≥1)

  • dryRun (optional)

remove_goal_tags

Detach tags from a goal. Prefer tagNames — the tool looks up matching tag IDs from the goal's current tag list. tagIds is supported for callers that already have them.

Parameters:

  • goalId (required): goal ARI

  • tagNames (optional): array of tag names — looked up against the goal's current tags; errors if a name is not currently attached

  • tagIds (optional): array of tag ARIs — provide either tagNames or tagIds

  • dryRun (optional)

Operational

health_check

Verify API connectivity, authentication, and performance.

Parameters:

  • verbose (optional): include diagnostic details (default false)

Development

Build

npm run build

Watch Mode

For development with automatic rebuilding:

npm run watch

Project Structure

atlassian-goals-mcp/
├── src/
│   ├── index.ts                          # Entry point
│   ├── server.ts                         # MCP server setup
│   ├── config.ts                         # Configuration management
│   ├── atlassian/
│   │   ├── client.ts                     # GraphQL client
│   │   ├── queries.ts                    # GraphQL query + mutation definitions
│   │   ├── mutation-result.ts            # Shared payload-error unwrap for write mutations
│   │   └── types.ts                      # TypeScript interfaces
│   ├── tools/
│   │   ├── index.ts                      # Tool registry + executeTool dispatch
│   │   ├── list-goals.ts                 # Goal tools — read
│   │   ├── get-goal.ts
│   │   ├── get-goals.ts
│   │   ├── search-goals.ts
│   │   ├── list-projects.ts              # Project tools — read
│   │   ├── get-project.ts
│   │   ├── get-projects.ts
│   │   ├── search-projects.ts
│   │   ├── post-goal-update.ts           # Goal tools — write
│   │   ├── edit-goal-update.ts
│   │   ├── delete-latest-goal-update.ts
│   │   ├── update-goal.ts
│   │   ├── add-goal-tags.ts
│   │   ├── remove-goal-tags.ts
│   │   └── health-check.ts
│   └── utils/
│       ├── logger.ts                     # Logging utility
│       ├── errors.ts                     # Error handling
│       ├── adf-parser.ts                 # ADF → text
│       ├── markdown-to-adf.ts            # Markdown → ADF JSON (write fields)
│       ├── goal-update-status.ts         # Score/status resolution shared by post/edit
│       ├── tql.ts                        # TQL escaping/builders
│       ├── goal-formatter.ts             # Read-tool formatting
│       └── project-formatter.ts          # Read-tool formatting
├── tests/
│   ├── unit/                             # Unit tests
│   ├── integration/                      # Integration tests
│   └── helpers/                          # Test utilities
├── scripts/                              # Introspection + live verification scripts
├── build/                                # Compiled output
├── package.json
├── tsconfig.json
├── vitest.config.ts                      # Test configuration
└── README.md

Testing

This project uses Vitest for testing with separate unit and integration test suites.

Running Tests

# Run all tests
npm test

# Run unit tests only (fast, no credentials needed)
npm run test:unit

# Run integration tests (requires .env configuration)
npm run test:integration

# Watch mode for development
npm run test:watch

# Generate coverage report
npm run test:coverage

# Interactive UI
npm run test:ui

Unit Tests

Unit tests are located in tests/unit/ and test individual functions and modules in isolation. They don't require API credentials and should run quickly.

Coverage:

  • utils/adf-parser.test.ts — Atlassian Document Format parsing

  • utils/tql.test.ts — TQL escaping/injection prevention

  • utils/goal-update-status.test.ts — score/status resolution for the update tools

  • atlassian/client.test.ts — rate limiting and error handling

  • atlassian/mutation-result.test.ts — write-mutation payload-error unwrapping

  • tools/*.test.ts — schema validation for each tool

Integration Tests

Integration tests are located in tests/integration/ and test against the real Atlassian Goals API. They require valid credentials in your .env file.

Note: Integration tests are automatically skipped if credentials are not available. This allows unit tests to run in CI environments without requiring API access.

To run integration tests locally:

  1. Set up your .env file with valid Atlassian credentials

  2. Optionally set TEST_OWNER_ACCOUNT_ID to a valid account ID from your workspace to test owner filtering. To find your account ID, look at the owner.accountId field on any goal returned by get_goal.

  3. Run npm run test:integration

Integration test suites:

  • connection.test.ts — API connectivity and configuration

  • health-check.test.ts — health-check tool behavior

  • list-goals.test.ts — goal listing

  • get-goal.test.ts — single goal detail

  • get-goals.test.ts — batch goal fetching

  • search-goals.test.ts — TQL goal search

  • projects.test.ts — project list/get/search

  • updates.test.ts — goal update data structures

Write tools (post_goal_update, edit_goal_update, delete_latest_goal_update, update_goal, add_goal_tags, remove_goal_tags) are exercised by the scripts/test-*.js live-verification scripts rather than the integration test suite — they need a known-safe test goal to write against. See Development Scripts below.

Development Scripts

# GraphQL schema introspection (npm-aliased)
npm run introspect:goal      # Inspect TownsquareGoal type
npm run introspect:types     # Inspect available types
npm run introspect:updates   # Inspect update types
npm run introspect:metric    # Inspect metric types

# Diagnostic tools
npm run diagnose:ari         # Test ARI format variations

Several more one-off scripts live in scripts/ and are run directly with node:

# Type introspection (used when adding write tools)
node scripts/introspect-write-inputs.js
node scripts/introspect-edit-delete.js
node scripts/introspect-tag-mutations.js
node scripts/introspect-mutations.js

# Live-verification harnesses for the write tools — each one posts/edits/
# deletes test data on a "Jeffrey Test" goal and reverts when possible.
# These are NOT in the integration test suite because they need a known-safe
# test goal to write against.
node scripts/test-post-goal-update.js
node scripts/test-edit-delete-goal-update.js
node scripts/test-update-goal.js
node scripts/test-tag-tools.js
node scripts/verify-update-notes-behavior.js

These scripts are useful for:

  • Exploring available GraphQL fields

  • Verifying write-tool behavior end-to-end against the live API

  • Troubleshooting API connectivity

  • Understanding the data schema

Troubleshooting

Authentication Errors

If you see authentication errors:

  • Verify your API token is correct and hasn't expired

  • Ensure your email matches the Atlassian account

  • Check that your Cloud ID is correct

Connection Errors

If the server can't connect:

  • Verify your site URL is correct

  • Check your network connection

  • Ensure you have access to the Atlassian Goals API

Configuration Errors

If you see "Invalid configuration" errors:

  • Check all required environment variables are set

  • Verify the format of your site URL (must be a valid URL)

  • Ensure your email is in valid email format

Package Installation Errors

If npx fails to install or run the server, you may encounter authentication or network errors from your package manager:

Symptoms:

  • npm ERR! code E401 or npm ERR! 401 Unauthorized

  • ETIMEDOUT or ENOTFOUND errors

  • Proxy authentication failures

  • Certificate verification errors

Common Causes:

  • Corporate package registry proxies (Artifactory, Nexus, Verdaccio)

  • npm registry authentication required

  • Network proxy configuration

  • SSL/TLS certificate issues

Debugging Steps:

  1. Check npm registry configuration:

    npm config get registry
    # Should show https://registry.npmjs.org/ for public packages
  2. Check for authentication requirements:

    npm config get //registry.npmjs.org/:_authToken
    # If set, your npm may require authentication for public packages
  3. View all npm configuration:

    npm config list
    # Look for proxy, registry, or cert settings
  4. Test registry access:

    npm view @modelcontextprotocol/sdk version
    # Should return a version number if registry is accessible

Solutions:

  • Corporate registry: Contact your IT team about accessing public npm packages

  • Proxy settings: Configure npm proxy settings or use VPN

  • Direct registry: Temporarily use the official npm registry:

    npm config set registry https://registry.npmjs.org/
  • Local installation: Clone the repository and use the local development setup instead of npx

Logging and Performance Monitoring

The server includes structured logging and performance profiling capabilities.

Environment Variables:

# Enable debug logging (logs INFO level and above)
DEBUG=true

# Enable trace logging (very verbose, includes timing details)
TRACE=true

# Show performance metrics in tool responses
SHOW_PERFORMANCE=true

Log Levels:

  • ERROR: Errors and failures

  • WARN: Warnings and potential issues

  • INFO: Tool calls, completions, and important events

  • DEBUG: Detailed diagnostic information (requires DEBUG=true)

  • TRACE: Very detailed tracing including timers (requires DEBUG=true and TRACE=true)

Log Format:

[2025-01-06T12:34:56.789Z] [INFO] Tool called: list_goals {"tool":"list_goals","operation":"start","args":"{\"limit\":20}"}
[2025-01-06T12:34:57.123Z] [INFO] Tool completed: list_goals (334ms) {"tool":"list_goals","operation":"complete","duration":334,"resultSize":1250}

Performance Profiling:

  • Automatic timing for all tool calls

  • Duration logged in milliseconds

  • Result size tracking

  • Optional performance metrics in responses (with SHOW_PERFORMANCE=true)

Viewing Logs:

  • Logs are written to stderr (stdout is reserved for MCP JSON-RPC)

  • In Claude Desktop: View logs in developer console

  • In terminal: Redirect stderr to file: node build/index.js 2> logs.txt

Debug Mode

Enable debug logging by adding to your environment variables:

DEBUG=true

API Reference

This server uses the Atlassian Goals GraphQL API. For more information:

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit issues or pull requests.

Support

For issues related to:

Available Tools

15 tools
add_goal_tagsA

Attach one or more tags to a goal by name. Tag names that don't yet exist at the workspace level are auto-created — be aware this leaves a new workspace-level tag behind, and the Townsquare API does not expose a delete-tag mutation. Use the exact spelling and casing of an existing tag when possible.

Example

add_goal_tags({
  goalId: "ari:cloud:townsquare:...:goal/abc",
  tagNames: ["Platform", "Q4"]
})
ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoIf true, return the resolved mutation payload without submitting
goalIdYesGoal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid})
tagNamesYesTag names to attach. Auto-created at the workspace level if missing.

TDQS

A4.4/5.0
Behavior5/5

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

The description discloses significant behavioral traits: tag names that don't exist are auto-created at the workspace level, and the Townsquare API has no delete-tag mutation. This goes beyond schema details and warns the agent about potentially irreversible side effects.

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 compact and front-loaded with purpose, followed by a crucial warning and a concrete example. Every sentence contributes meaningful information without wasted words.

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 simple mutation with no output schema, the description covers the core purpose, side effects, and an example. It does not describe return values or error behavior, but given the tool's simplicity and full schema coverage, the description is adequate.

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 input schema already describes all parameters (100% coverage). The description adds a usage note about exact spelling and casing for tagNames and includes an example that clarifies the goalId format, providing value beyond 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 clear action: 'Attach one or more tags to a goal by name.' This specifies the resource (goal) and the method (by name), and it distinguishes the tool from its sibling remove_goal_tags.

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 implies the usage (to add tags) but does not explicitly reference an alternative such as remove_goal_tags for removal. It provides a caution about auto-created tags and the lack of a delete-tag mutation, which informs when to use it, but this is implied rather than stated as explicit 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.

delete_latest_goal_updateA

Delete the latest goal update on a goal. The Townsquare API only supports deleting the most recent update per goal — earlier updates cannot be removed this way. Resolve the update ARI via get_goal (the first item in the updates list) before calling.

If the supplied ID is not the latest update for its goal, the API will reject the call.

Example

delete_latest_goal_update({
  goalUpdateId: "ari:cloud:townsquare:...:goal-update/abc"
})
ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoIf true, return the resolved mutation payload without submitting
goalUpdateIdYesGoal update ARI (format: ari:cloud:townsquare:{cloudId}:goal-update/{uuid}). Must be the latest update on its goal.

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well by disclosing the latest-only limitation and API rejection for non-latest IDs. It doesn't mention return values or auth, but the example and limitation details provide solid behavioral context.

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 compact, front-loaded with the core action, and includes a well-placed example. Every sentence is useful, and the structure (limitation, resolution step, rejection behavior, example) is logical and efficient.

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 delete tool with no annotations or output schema, the description provides essential context: the constraint on which update can be deleted, how to obtain the correct ID, and the expected failure mode. This is complete enough for an agent to use the tool effectively.

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 100%, so baseline is 3. The description adds value by explaining that goalUpdateId must be the latest update and how to resolve it via get_goal, going beyond the schema's format description. It doesn't cover dryRun, but the schema already does.

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 'Delete the latest goal update on a goal,' using a specific verb and resource while clearly distinguishing from siblings like edit_goal_update and post_goal_update. It explicitly narrows scope to the most recent update, making the purpose unambiguous.

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?

Provides concrete guidance: resolve the update ARI via get_goal (first item in updates list) before calling, and warns that earlier updates cannot be removed. This effectively states when to use the tool and the prerequisite, and implicitly excludes non-latest updates.

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

edit_goal_updateA

Edit a previously-posted goal update — fix a typo, adjust status/score, correct a metric value, replace the More detail body, etc. Identify the update by its ARI (the id returned from post_goal_update or from a goal's updates list). Both goalId and goalUpdateId are required so the tool can resolve the existing note ARI when replacing details.

Only the fields you supply are changed; all others are left alone. At least one of summary/details/status/score/targetDate/metricUpdates is required.

Status/score behaves identically to post_goal_update: on_track/at_risk/off_track derive from a 1–100 score; pending/paused/done/cancelled/archived take only status.

Markdown — both summary and details accept markdown and are converted to ADF before send.

Details replace, not append — when details is supplied, the tool looks up the update's existing "More detail" note and overwrites it. (Townsquare's editUpdate API would otherwise create a second note that the UI doesn't surface.)

Metric updatesedit_goal_update takes metricId (the metric itself), not targetId (the metric target). This is asymmetric with post_goal_update and matches the Townsquare API.

Example

edit_goal_update({
  goalId: "ari:cloud:townsquare:...:goal/abc",
  goalUpdateId: "ari:cloud:townsquare:...:goal-update/xyz",
  summary: "Corrected summary — actually on track, not at risk.",
  status: "on_track"
})
ParametersJSON Schema
NameRequiredDescriptionDefault
scoreNoConfidence score on the 1–100 scale.
dryRunNoIf true, return the resolved mutation payload without submitting
goalIdYesGoal ARI that owns the update (format: ari:cloud:townsquare:{cloudId}:goal/{uuid}). Required so the tool can look up the existing More-detail note when replacing details.
statusNoStatus — same score/non-score rules as post_goal_update.
detailsNoNew "More detail" body (markdown supported). Behavior with existing notes is currently to append a new note; verify if replacement is needed.
summaryNoNew headline (max 280 chars, markdown supported)
targetDateNoNew target date
goalUpdateIdYesGoal update ARI (format: ari:cloud:townsquare:{cloudId}:goal-update/{uuid})
metricUpdatesNoNew current values. Each item uses metricId (NOT targetId — this differs from post_goal_update).

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries full transparency burden and exceeds it: it discloses partial-update semantics (only supplied fields change), markdown-to-ADF conversion, details-overwrite behavior (and why), and the metricId vs targetId asymmetry. This goes well beyond structured schema data.

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 well-organized with sections, a code example, and no filler. It is slightly longer than necessary but every sentence adds context about behavior or usage.

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 9-parameter tool with nested objects and no output schema, the description covers identification, required fields, partial updates, status/score derivation, markdown handling, details replacement, and metricUpdates schema. It leaves nothing ambiguous for invocation.

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 covers 100% of parameters, so baseline is 3; the description adds substantial meaning by explaining why both goalId and goalUpdateId are needed, clarifying that metricUpdates requires metricId rather than targetId, and correcting the schema's ambiguous 'append' note by explicitly stating details replace. This tips the score above baseline.

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 'Edit' with the resource 'goal_update' and lists exact use cases (fix a typo, adjust status/score, correct a metric value, replace body). It clearly distinguishes from sibling tools by referencing 'previously-posted' and comparing to post_goal_update.

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?

It establishes when to use: for editing an existing update, and contrasts with post_goal_update (the create tool) through status/score rules and metricUpdates asymmetry. It also states the prerequisite that at least one editable field is required. However, it doesn't explicitly name alternative tools for different actions (e.g., update_goal for goal properties).

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

get_goalA

Get detailed information about a specific goal by its ID. Returns complete goal details including description, metrics, parent/child relationships, and recent updates.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalIdYesThe unique identifier of the goal (ARI format: ari:cloud:townsquare:{cloudId}:goal/{uuid})

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the transparency burden. It states that it 'Returns complete goal details' and lists included fields, which implies a read-only operation. However, it does not disclose any permissions, potential errors, or side effects. For a simple read, this is adequate but not rich, hence a mid-level score.

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, front-loaded sentence: 'Get detailed information about a specific goal by its ID.' It immediately communicates the core action and then efficiently lists what is returned. No filler or redundant content.

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?

With no output schema, the description appropriately explains the return value by enumerating key fields (description, metrics, parent/child relationships, recent updates). It covers the main purpose sufficiently for a simple get-by-ID tool, though it omits details like error behavior or permissions. Overall, it is complete enough for expected use.

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 for the only parameter (goalId), including its ARI format. The tool description merely says 'by its ID' which adds no new meaning beyond the schema. Since the schema already fully documents the parameter, 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 clearly states 'Get detailed information about a specific goal by its ID', using a specific verb ('Get') and resource ('goal') with the distinguishing mechanism ('by its ID'). This separates it from sibling tools like list_goals (listing) and search_goals (searching), and from get_goals (plural) which likely fetches multiple goals.

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 implies usage when you have a specific goal ID and want complete details. However, it does not explicitly mention when not to use it or name alternatives such as list_goals or search_goals. The 'by its ID' phrasing provides clear context, but no exclusions or alternative references are given.

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

get_goalsA

Fetch multiple goals by their IDs in a single batch request. Returns complete goal details including description, metrics, parent/child relationships, and recent updates for each goal. More efficient than calling get_goal multiple times.

ParametersJSON Schema
NameRequiredDescriptionDefault
goalIdsYesArray of goal IDs to fetch (ARI format: ari:cloud:townsquare:{cloudId}:goal/{uuid}). Maximum 20 goals per request.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of describing behavior. It discloses what the tool returns (complete goal details, relationships, updates) and that it's batch-oriented, but does not mention error handling for invalid/missing IDs, partial-failure behavior, or auth prerequisites. Basic read behavior is implied but not explicit.

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?

Two concise sentences package the purpose, return value, and efficiency benefit with no filler. Information is front-loaded and every phrase adds value.

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?

Given the tool's low complexity (one parameter, no output schema), the description provides adequate context: it states what is fetched, what details are returned, and the advantage over the singular alternative. It could mention edge-case behavior but is otherwise complete for a batch fetch.

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 already provides 100% coverage for the single parameter, including ARI format and maximum count. The description adds no new semantic detail about the parameter itself; its value mainly restates the batch context.

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 fetches multiple goals by their IDs in a batch request, which distinguishes it from get_goal and list_goals/search_goals. It names the specific resource and operation, and explicitly contrasts with get_goal.

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 provides clear guidance: use this when you need multiple goals by known IDs, and it is more efficient than calling get_goal repeatedly. It does not explicitly exclude list_goals or search_goals, but the batch-by-ID purpose implies that distinction.

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

get_projectA

Get detailed information about a specific project by its ID. Returns complete project details including description, members, linked goals, and recent updates.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesThe unique identifier of the project (ARI format: ari:cloud:townsquare:{cloudId}:project/{uuid})

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description must carry the burden. It discloses the return value (description, members, linked goals, recent updates), which is transparent for a read operation. It does not mention errors or permissions, but for a simple get, this is acceptable.

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, front-loaded sentence that clearly states the action, resource, and key return fields. It is concise and every word 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?

With one parameter, no output schema, and a simple get operation, the description is complete. It enumerates the return details, providing sufficient context for an agent to anticipate the tool's 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 100% and the parameter description is detailed, including the ARI format. The tool description adds no new meaning beyond restating 'by its ID', so the baseline 3 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 clearly states the tool retrieves detailed information for a single project by ID, with a specific verb 'Get' and resource 'project'. It distinguishes itself from siblings like list_projects by emphasizing 'specific project' and 'by its ID'.

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 usage when you need complete details for one known project, but it does not explicitly name alternatives or when-not-to-use it. The context is clear enough for an agent to infer the distinction from sibling tools.

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

get_projectsA

Fetch multiple projects by their IDs in a single batch request. Returns complete project details including description, members, linked goals, and recent updates for each project. More efficient than calling get_project multiple times.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdsYesArray of project IDs to fetch (ARI format: ari:cloud:townsquare:{cloudId}:project/{uuid}). Maximum 20 projects per request.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosing behavior. It does state the batch nature and return contents, but lacks mention of error handling for invalid IDs, ordering, or explicit read-only status. 'Fetch' implies safety, but not explicitly stated.

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 action and efficiently covers purpose, return details, and rationale for preference.

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 single-parameter batch read, the description covers the core purpose, expected return content, and efficiency advantage. It lacks edge-case behavior (e.g., partial failures, missing IDs) but is largely complete given the schema's parameter detail and absence of an output schema.

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 fully describes the only parameter (projectIds) with format and max items, so description adds little extra meaning. The phrase 'by their IDs' reinforces but does not enrich beyond the schema, matching the baseline for high schema coverage.

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 specifies a clear verb ('Fetch'), resource ('multiple projects by their IDs'), and scope ('single batch request'). It also distinguishes itself from the sibling tool get_project by highlighting efficiency, making the purpose 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 explicitly frames when to use this tool over get_project ('More efficient than calling get_project multiple times'), naming the alternative. However, it does not mention exclusions or other siblings like list_projects/search_projects, so it falls short of full when/when-not guidance.

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

health_checkA

Check API connectivity and authentication status with the Atlassian Goals API. Returns connection status, response time, and diagnostic information.

ParametersJSON Schema
NameRequiredDescriptionDefault
verboseNoInclude detailed diagnostic information (default: false)

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries full burden. It discloses what is checked and what is returned (connection status, response time, diagnostics), but does not explicitly state side effects (e.g., read-only), auth requirements for the call itself, or network behavior. Adequate but not rich.

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?

Two sentences with no filler. The verb is front-loaded, and every clause adds value: what it checks, what it returns, and diagnostic scope.

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 tool is simple with one optional parameter and no output schema. The description covers purpose and return values, which is sufficient for a health-check tool. Could add a note on when to run it, but not necessary for completeness.

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 single parameter 'verbose' is fully described in the schema (100% coverage), so the description adds no new parameter-level meaning. Baseline 3 is appropriate as 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 uses a specific verb ('Check') with a clear resource ('API connectivity and authentication status') and lists return values. It is immediately distinct from sibling tools that operate on goals/projects.

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 implies use for verifying connectivity and authentication, but does not explicitly reference alternatives or exclusions. Still, the context is unambiguous given the sibling tool set.

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

list_goalsA

List Atlassian Goals with optional filtering by status, search term, or tags. Supports cursor-based pagination for retrieving large result sets.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter goals by tags. When multiple tags are provided, returns goals matching ALL tags.
limitNoMaximum number of goals to return (1-100, default: 20)
cursorNoPagination cursor from previous response to fetch next page
statusNoFilter goals by status
searchTermNoFilter goals by name (partial match)

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses the list behavior and cursor-based pagination, but does not describe the response shape, ordering, or any potential rate limits. For a read-only list tool, this is adequate but not thorough.

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 sentence, front-loaded with the primary purpose, and includes all essential capabilities (filtering, pagination) without extraneous detail.

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?

With no output schema, the description covers the key aspects of listing and filtering goals, and mentions pagination which is critical for large result sets. It does not describe the response format, but for a list operation this is acceptable given the schema detail.

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% for all five parameters, each with clear descriptions. The description adds context about optional filtering and pagination but does not go beyond the schema details. Baseline 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 clearly states 'List Atlassian Goals' with optional filters by status, search term, or tags, and mentions pagination. This distinguishes it from siblings like get_goal (single goal) and list_projects (different resource).

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 implies usage for listing/filtering goals and pagination, but does not explicitly contrast it with sibling tools such as search_goals or get_goals. No when-not-to-use guidance is provided.

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

list_projectsA

List Atlassian Projects with optional filtering by name. Supports cursor-based pagination for retrieving large result sets.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of projects to return (1-100, default: 20)
cursorNoPagination cursor from previous response to fetch next page
searchTermNoFilter projects by name (partial match)

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose cursor-based pagination and optional name filtering, which are useful behavioral traits. However, it omits other characteristics like response shape or any side effects, which a fully transparent description might include.

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, front-loaded with the core purpose, and contains no fluff. Every word contributes meaning, making it highly efficient.

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

Completeness3/5

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

The description covers the main functionality but lacks differentiation from sibling tools like search_projects and does not describe return values (no output schema). For a simple list tool, it is adequate but not fully complete given the ambiguous sibling relationships.

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 offers 100% coverage with descriptions for all three parameters. The description adds minimal value beyond confirming the name filter and mentioning pagination for large sets, which aligns with the baseline for high schema coverage.

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 clearly states the tool lists Atlassian Projects with optional name filtering. It uses a specific verb and resource, making the purpose evident. However, it does not explicitly differentiate from sibling tools like search_projects or get_projects, which could lead to agent confusion.

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 usage for listing projects and specifically calls out pagination for large result sets, providing clear context. It does not explicitly mention alternatives or when not to use the tool, 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.

post_goal_updateA

Post a weekly status update to a goal — the entry that appears in the goal's Updates tab. Resolve the goal's ARI via search_goals or get_goal first; this tool requires the ID, not a name.

Status and score Status for on_track / at_risk / off_track is derived from the score (1–100 integer). Pick whichever the user expresses:

  • "we're on track" → status: "on_track" (tool fills the band's midpoint score, 80)

  • "on track at 90" → status: "on_track", score: 90

  • "score 50" alone → score: 50 (status inferred as at_risk) The Atlassian UI labels these as decimals (e.g. "On track - 0.8"), but the API stores them as 1–100. Translate accordingly: 0.8 → 80. For pending / paused / done / cancelled / archived, send only status — these are non-score states and adding a score is a validation error.

Markdown Both summary and details accept markdown — headings, bold/italic, lists, links, inline and block code, blockquotes. The tool converts to ADF before sending.

Example call

post_goal_update({
  goalId: "ari:cloud:townsquare:...:goal/abc",
  summary: "Shipped the migration; on track for end-of-quarter delivery.",
  details: "## What landed\n- Migration scripts merged\n- Rollback plan validated",
  status: "on_track",
  metricUpdates: [{ targetId: "...", value: 42 }]
})
ParametersJSON Schema
NameRequiredDescriptionDefault
scoreNoConfidence score on the 1–100 scale (the Atlassian UI labels these as decimals like "0.8" but the API stores integers). Bands: 10–30 = off_track, 40–60 = at_risk, 70–100 = on_track. If status is omitted, it is inferred from the band.
dryRunNoIf true, return the resolved mutation payload without submitting
goalIdYesGoal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid}). Obtain from search_goals or get_goal.
statusNoReported status. Score-driven (on_track/at_risk/off_track) — supplied alone, uses band midpoint score (80/50/20). Combined with score, validates that score falls within the band. Non-score (pending/paused/done/cancelled/archived) — must NOT be combined with score.
detailsNoOptional longer-form content for the "More detail" panel. Markdown supported (headings, bold/italic, lists, links, code, blockquotes). No length limit.
summaryYesUpdate headline shown by default in the Updates tab. Max 280 characters. Markdown supported.
targetDateNoOptionally update the target date as part of this status post
metricUpdatesNoCurrent values to record against the goal's metric targets

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries full responsibility for behavioral disclosure. It thoroughly explains the status/score derivation, including the specific band ranges, midpoint scores, and the UI decimal-to-integer translation (e.g., '0.8 → 80'). It also warns about validation errors when combining non-score statuses with a score, and notes the markdown-to-ADF conversion. These are critical behaviors beyond simple 'posts an update'.

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 well-structured with bold headers for 'Status and score' and 'Markdown,' plus an example call. It is information-dense but every section contributes to correct usage. It is slightly long given the markdown details, but the complexity of the tool justifies the extra words, and the example is highly practical.

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?

This is a complex tool with 8 parameters and no output schema. The description covers all critical aspects: how to obtain the required goalId, the nuanced status/score mapping and validation constraints, markdown support, and includes a complete example call. Even though return values are not described, there is no output schema to reference, so the description sufficiently prepares the agent for invocation. Sibling tools are also contextually implied through the 'post' framing.

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 input schema already has 100% parameter description coverage, setting a baseline of 3. The description adds significant semantic layers for the most complex parameters: it explains how score and status interact with band midpoints, provides concrete examples, and clarifies that goalId must be an ARI. While targetDate and metricUpdates rely on their schema descriptions, the overall parameter guidance is enriched meaningfully.

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's purpose: 'Post a weekly status update to a goal — the entry that appears in the goal's Updates tab.' It uses a specific verb ('post') and resource ('goal update'), and distinguishes it from sibling tools like edit_goal_update and delete_latest_goal_update by the 'post' framing. The requirement for an ARI rather than a name further specifies the tool's input.

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 provides a clear prerequisite: 'Resolve the goal's ARI via search_goals or get_goal first; this tool requires the ID, not a name.' This guides the agent on preparation before invoking the tool. However, it does not explicitly mention alternatives like edit_goal_update for modifying existing updates or delete_latest_goal_update for removing them, so it stops short of an exhaustive when-not-to-use explanation.

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

remove_goal_tagsA

Detach one or more tags from a goal. Prefer tagNames (the tool looks up matching tag IDs from the goal's current tag list); tagIds is supported for the rare case where the caller already has them. Tags are only detached from the goal — the workspace-level tag definition remains.

Example

remove_goal_tags({
  goalId: "ari:cloud:townsquare:...:goal/abc",
  tagNames: ["Q4"]
})
ParametersJSON Schema
NameRequiredDescriptionDefault
dryRunNoIf true, return the resolved mutation payload without submitting
goalIdYesGoal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid})
tagIdsNoTag IDs to remove. Bypass the name lookup. Provide either tagNames or tagIds.
tagNamesNoTag names to remove. The tool looks up their IDs by querying the goal's current tags. Errors if a name is not currently attached.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It explicitly reveals a key side effect: tags are only detached from the goal, and the workspace-level tag definition remains. It also clarifies the lookup behavior for tagNames. This is meaningful transparency beyond a simple restatement, though it omits error behavior and dryRun semantics.

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 concise: two sentences plus a focused example. It is front-loaded with the action, and every sentence serves a purpose—clarifying the operation, the parameter preference, and the scope of effect. No wasted words.

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 purpose, side effects, and parameter usage, and the example provides a concrete usage pattern. It does not mention return values or dryRun, but given no output schema and a simple mutation, the core context is sufficiently complete. The sibling list and schema fill in the rest.

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 100%, so the baseline is 3. The description adds value by explaining the functional difference between tagNames and tagIds (tagNames looks up IDs from the goal's current tags), and the example illustrates how to pass tagNames. This goes beyond the schema's field-level descriptions.

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's function: 'Detach one or more tags from a goal.' It uses a specific verb ('detach') and resource ('goal'), and the scoping detail ('Tags are only detached from the goal — the workspace-level tag definition remains') distinguishes it from related tools like add_goal_tags.

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 provides clear usage context, explicitly preferring tagNames over tagIds and explaining when tagIds is appropriate ('rare case where the caller already has them'). It does not explicitly mention alternatives like add_goal_tags, but the parameter-preference guidance and example give strong contextual direction.

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

search_goalsA

Search for goals using TQL (Townsquare Query Language). Supports flexible queries with multiple operators.

Supported operators:

  • LIKE: Partial text match. Use _ as single-character wildcard. Example: name LIKE "A.1" or name LIKE "A._"

  • =: Exact match for status/owner. Example: status = on_track

  • AND: Combine conditions. Example: name LIKE "Q4" AND status = on_track

  • OR: Match either condition. Example: name LIKE "A." OR name LIKE "B."

Searchable fields:

  • name: Goal name (use LIKE for partial match)

  • status: Goal status (pending, on_track, at_risk, off_track, done, cancelled)

  • owner: Owner account ID (use = for exact match)

  • tag: Goal tag (use LIKE for partial match)

Examples:

  • Find goals containing "Q4": name LIKE "Q4"

  • Find goals A.1, B.1, C.1: name LIKE "A.1" OR name LIKE "B.1" OR name LIKE "C.1"

  • Find all A.x goals: name LIKE "A."

  • Find on-track Q4 goals: name LIKE "Q4" AND status = on_track

  • Find goals by owner: owner = 712020:user-uuid-here

  • Find goals with a specific tag: tag LIKE "Platform"

  • Find goals with multiple tags (all): tag LIKE "Platform" AND tag LIKE "Q1"

  • Find goals with any of several tags: tag LIKE "Platform" OR tag LIKE "Security"

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (1-100, default: 20)
cursorNoPagination cursor from previous response to fetch next page
searchStringYesTQL query string. Examples: 'name LIKE "A.1"', 'status = on_track', 'name LIKE "Q4" AND status = on_track'

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It thoroughly explains the TQL syntax, supported operators, fields, and provides examples, which effectively communicates the query behavior. It stops short of describing response format or error handling, but for a search tool the core behavior is well disclosed.

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 structured with clear sections for operators, fields, and examples. Every sentence carries informative weight, and the use of headers and bullet points makes it scannable. It is appropriately detailed for a query language tool without being redundant.

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?

Given the complexity of TQL and the absence of an output schema, the description covers the essential aspects: what can be searched, how to construct queries, and provided examples. It lacks explicit behavior about pagination or result structure, but the schema covers cursor and limit, so the description is nearly complete.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial meaning beyond the schema by defining each searchable field, explaining operator usage, and giving concrete query examples. This is significantly more than the schema's terse parameter descriptions.

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 'Search for goals using TQL' with a specific verb and resource. It distinguishes itself from sibling tools like list_goals by emphasizing flexible, operator-based searching, and from get_goal/get_goals by covering multi-condition queries.

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 provides extensive context on when to use the tool through operator explanations and multiple examples (e.g., filtering by name, status, owner, tag). It does not explicitly name alternatives or exclusion criteria, but the search-focused language and examples imply it is for filtered queries rather than simple listing.

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

search_projectsA

Search for projects using TQL (Townsquare Query Language). Supports name-based queries.

Supported operators:

  • LIKE: Partial text match. Example: name LIKE "Integration"

  • OR: Match either condition. Example: name LIKE "Integration" OR name LIKE "Migration"

Searchable fields:

  • name: Project name (use LIKE for partial match)

Examples:

  • Find projects containing "Integration": name LIKE "Integration"

  • Find projects matching multiple terms: name LIKE "Integration" OR name LIKE "API"

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (1-100, default: 20)
cursorNoPagination cursor from previous response to fetch next page
searchStringYesTQL query string. Examples: 'name LIKE "Integration"', 'name LIKE "API" OR name LIKE "Migration"'

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses that the tool supports name-based queries with LIKE and OR operators, and that only the 'name' field is searchable. This provides behavioral constraints beyond just the tool name, although it doesn't explicitly state that the operation is read-only or describe error handling.

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 well-structured with clear sections for operators, fields, and examples. It is slightly verbose given the schema already includes examples, but every sentence contributes to understanding the TQL syntax. The first sentence provides immediate clarity.

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

Completeness3/5

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

There is no output schema and no annotations, so the description should explain return values and pagination. It does not mention what the response looks like, that results are paginated, or how the cursor works beyond the schema's mention. While the schema covers cursor and limit, the description is incomplete for a tool with no output schema.

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 description coverage is 100%, so a baseline of 3 applies. The description adds meaning beyond the schema by thoroughly explaining the TQL language, operators, and examples, which helps the agent construct valid searchString values. It also clarifies that queries are name-based only.

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's purpose: 'Search for projects using TQL (Townsquare Query Language)' and goes on to specify the supported operators, searchable fields, and examples. It distinguishes itself from sibling tools like search_goals by focusing on projects and from list_projects by introducing TQL as the search method.

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 usage when you need to filter projects by name using TQL conditions, providing examples that illustrate the query syntax. It doesn't explicitly mention when not to use it or name alternatives, but the examples and field specification give clear context for typical use cases.

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

update_goalA

Edit a goal's metadata — name, description, owner, target date, start date, or archive flag. Status changes are NOT done here; use post_goal_update to change status. Tag changes are also separate (use add_goal_tags / remove_goal_tags).

Only the fields you supply are changed; all others are left alone. At least one editable field is required.

Markdowndescription accepts markdown and is converted to ADF before send.

Owner — pass an Atlassian account ID (the same value that comes back from get_goal as owner.accountId).

Archivearchived: true archives the goal (hides it from active lists); archived: false unarchives. This is destructive in effect — confirm with the user before archiving real goals.

Example

update_goal({
  goalId: "ari:cloud:townsquare:...:goal/abc",
  name: "Renamed goal",
  description: "## New description\nUpdated context here.",
  targetDate: { date: "2026-12-31", confidence: "QUARTER" }
})
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew goal name (plain text)
dryRunNoIf true, return the resolved mutation payload without submitting
goalIdYesGoal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid})
ownerIdNoNew owner — pass an Atlassian account ID (e.g. "712020:user-uuid-here")
archivedNoSet true to archive the goal, false to unarchive. Destructive in effect — confirm before archiving.
startDateNoNew start date (YYYY-MM-DD)
targetDateNoNew target date
descriptionNoNew goal description (markdown supported, converted to ADF)

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully carries the burden. It discloses that only supplied fields change (partial update), that markdown is converted to ADF, that archiving is destructive in effect, and that owner takes an Atlassian account ID. These are non-obvious behaviors beyond what the schema states.

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 longer than average but front-loaded with purpose, then exclusions, then behaviors, and a helpful example. Every section adds value; the bulleted structure aids scanning. Slightly verbose but earns its space.

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 mutation tool with 8 parameters, no annotations, and no output schema, the description covers essential context: partial update semantics, exclusions, destructive archive, markdown conversion, owner ID format, and a realistic example. This is complete enough for an agent to invoke correctly.

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 100%, so baseline is 3. The description adds meaningful context beyond the schema: owner account ID type, destructive archive semantics, markdown conversion, and a concrete example with targetDate structure. Some params like startDate rely on schema alone, but the extra guidance elevates the score.

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: 'Edit a goal's metadata' and enumerates the editable fields. It explicitly distinguishes from sibling tools by stating status changes go through post_goal_update and tag changes via add/remove_goal_tags, making the purpose unambiguous.

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?

Provides explicit when-to-use guidance with named alternatives ('Status changes are NOT done here; use post_goal_update... Tag changes are also separate...'). Also states the requirement of at least one editable field and warns to confirm before archiving, giving clear conditions for use.

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. 15 tool updatesv1.0.0
    • First observedadd_goal_tags
    • First observeddelete_latest_goal_update
    • First observededit_goal_update
    • First observedget_goal
    • First observedget_goals
    • First observedget_project
    • First observedget_projects
    • First observedhealth_check
    • First observedlist_goals
    • First observedlist_projects
    • First observedpost_goal_update
    • First observedremove_goal_tags
    • First observedsearch_goals
    • First observedsearch_projects
    • First observedupdate_goal

TDQS

A4.1/5.0

Scored across 15 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: list versus search for retrieval, batch versus single get, update versus post/edit for modifications, and add/remove for tags. The only potential overlap is between list_goals and search_goals, but their descriptions clarify the use cases.

Naming Consistency4/5

Tool names follow a consistent snake_case verb_noun pattern, with plural forms for batch operations (get_goals vs get_goal). There is minor inconsistency with update_goal versus edit_goal_update, but the pattern remains predictable overall.

Tool Count5/5

15 tools is at the upper end of the ideal range and each tool has a clear role. The count is well-scoped for managing goals and projects, with no unnecessary tools.

Completeness2/5

The tool set lacks create_goal and delete_goal, which are core lifecycle operations. While it covers reading, searching, updating, and posting updates, the inability to create or delete goals is a significant gap that will block common workflows.

Maintenance

ActivityInactive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Model Context Protocol server that integrates with Atlassian Confluence and Jira, enabling AI assistants to search, create, and update content in these platforms through natural language interactions.
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A clean and focused Model Context Protocol (MCP) server that provides seamless integration between AI assistants and Jira, enabling natural language interaction with your Jira projects, issues, and workflows.
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that connects your AI IDE to Jira. Query your tickets, active sprint, and issue details directly from GitHub Copilot, Cursor, Claude Desktop, or any MCP-compatible client.
    16 npm
    ISC