Atlassian Goals MCP Server
Provides tools for querying, searching, and updating Atlassian Goals and Projects via the Atlassian Goals API, including reading goals and projects, posting weekly status updates, editing or deleting updates, updating goal metadata, and managing tags.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Atlassian Goals MCP Serverlist my top 10 goals with status in progress"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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(replaceyour-companywith your subdomain) and copy thecloudIdvalueSite 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.jsonWindows:
%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:
Clone and build:
git clone https://github.com/expel-io/atlassian-goals-mcp.git
cd atlassian-goals-mcp
npm install
npm run buildUpdate 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"
}
}
}
}Optionally create a
.envfile for testing:
cp .env.example .env
# Edit .env with your credentialsAvailable 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 20status(optional): one ofNOT_STARTED,IN_PROGRESS,COMPLETED,CANCELLEDsearchTerm(optional): partial-match filter on goal nametags(optional): array of tag names; multiple tags AND togethercursor(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_tracklimit(optional): 1–100, default 20cursor(optional): pagination cursor
Projects — Read
list_projects
List projects with optional name filtering and cursor pagination.
Parameters:
limit(optional): 1–100, default 20searchTerm(optional): partial-match filter on project namecursor(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 20cursor(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 ARIsummary(required): the visible headline, max 280 charsdetails(optional): longer-form "More detail" body (no length limit)status(optional): see abovescore(optional): integer 1–100targetDate(optional):{ date: "YYYY-MM-DD", confidence?: "EXACT"|"QUARTER"|"HALF"|"YEAR" }metricUpdates(optional):[{ targetId, value }]—targetIdis the metric target ID fromget_goaldryRun(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 ARIgoalUpdateId(required): update ARI (ari:cloud:townsquare:{cloudId}:goal-update/{uuid})summary,details,status,score,targetDate(all optional): same aspost_goal_updatemetricUpdates(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 goaldryRun(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 ARIname(optional): new goal namedescription(optional): markdownownerId(optional): Atlassian account ID (the valueget_goalreturns asowner.accountId)targetDate(optional):{ date, confidence? }startDate(optional):YYYY-MM-DDarchived(optional): booleandryRun(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 ARItagNames(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 ARItagNames(optional): array of tag names — looked up against the goal's current tags; errors if a name is not currently attachedtagIds(optional): array of tag ARIs — provide eithertagNamesortagIdsdryRun(optional)
Operational
health_check
Verify API connectivity, authentication, and performance.
Parameters:
verbose(optional): include diagnostic details (default false)
Development
Build
npm run buildWatch Mode
For development with automatic rebuilding:
npm run watchProject 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.mdTesting
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:uiUnit 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 parsingutils/tql.test.ts— TQL escaping/injection preventionutils/goal-update-status.test.ts— score/status resolution for the update toolsatlassian/client.test.ts— rate limiting and error handlingatlassian/mutation-result.test.ts— write-mutation payload-error unwrappingtools/*.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:
Set up your
.envfile with valid Atlassian credentialsOptionally set
TEST_OWNER_ACCOUNT_IDto a valid account ID from your workspace to test owner filtering. To find your account ID, look at theowner.accountIdfield on any goal returned byget_goal.Run
npm run test:integration
Integration test suites:
connection.test.ts— API connectivity and configurationhealth-check.test.ts— health-check tool behaviorlist-goals.test.ts— goal listingget-goal.test.ts— single goal detailget-goals.test.ts— batch goal fetchingsearch-goals.test.ts— TQL goal searchprojects.test.ts— project list/get/searchupdates.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 variationsSeveral 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.jsThese 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 E401ornpm ERR! 401 UnauthorizedETIMEDOUTorENOTFOUNDerrorsProxy 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:
Check npm registry configuration:
npm config get registry # Should show https://registry.npmjs.org/ for public packagesCheck for authentication requirements:
npm config get //registry.npmjs.org/:_authToken # If set, your npm may require authentication for public packagesView all npm configuration:
npm config list # Look for proxy, registry, or cert settingsTest 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=trueLog Levels:
ERROR: Errors and failuresWARN: Warnings and potential issuesINFO: Tool calls, completions, and important eventsDEBUG: 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=trueAPI 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:
This MCP server: Open an issue in this repository
Atlassian Goals API: Visit Atlassian Developer Community
Claude Desktop: Visit Anthropic Support
Available Tools
15 toolsadd_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"]
})| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, return the resolved mutation payload without submitting | |
| goalId | Yes | Goal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid}) | |
| tagNames | Yes | Tag names to attach. Auto-created at the workspace level if missing. |
TDQS
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.
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.
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.
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.
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.
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"
})| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, return the resolved mutation payload without submitting | |
| goalUpdateId | Yes | Goal update ARI (format: ari:cloud:townsquare:{cloudId}:goal-update/{uuid}). Must be the latest update on its goal. |
TDQS
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.
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.
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.
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.
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.
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 updates — edit_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"
})| Name | Required | Description | Default |
|---|---|---|---|
| score | No | Confidence score on the 1–100 scale. | |
| dryRun | No | If true, return the resolved mutation payload without submitting | |
| goalId | Yes | Goal 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. | |
| status | No | Status — same score/non-score rules as post_goal_update. | |
| details | No | New "More detail" body (markdown supported). Behavior with existing notes is currently to append a new note; verify if replacement is needed. | |
| summary | No | New headline (max 280 chars, markdown supported) | |
| targetDate | No | New target date | |
| goalUpdateId | Yes | Goal update ARI (format: ari:cloud:townsquare:{cloudId}:goal-update/{uuid}) | |
| metricUpdates | No | New current values. Each item uses metricId (NOT targetId — this differs from post_goal_update). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| goalId | Yes | The unique identifier of the goal (ARI format: ari:cloud:townsquare:{cloudId}:goal/{uuid}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| goalIds | Yes | Array of goal IDs to fetch (ARI format: ari:cloud:townsquare:{cloudId}:goal/{uuid}). Maximum 20 goals per request. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The unique identifier of the project (ARI format: ari:cloud:townsquare:{cloudId}:project/{uuid}) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| projectIds | Yes | Array of project IDs to fetch (ARI format: ari:cloud:townsquare:{cloudId}:project/{uuid}). Maximum 20 projects per request. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Include detailed diagnostic information (default: false) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter goals by tags. When multiple tags are provided, returns goals matching ALL tags. | |
| limit | No | Maximum number of goals to return (1-100, default: 20) | |
| cursor | No | Pagination cursor from previous response to fetch next page | |
| status | No | Filter goals by status | |
| searchTerm | No | Filter goals by name (partial match) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of projects to return (1-100, default: 20) | |
| cursor | No | Pagination cursor from previous response to fetch next page | |
| searchTerm | No | Filter projects by name (partial match) |
TDQS
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.
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.
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.
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.
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.
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 onlystatus— 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 }]
})| Name | Required | Description | Default |
|---|---|---|---|
| score | No | Confidence 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. | |
| dryRun | No | If true, return the resolved mutation payload without submitting | |
| goalId | Yes | Goal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid}). Obtain from search_goals or get_goal. | |
| status | No | Reported 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. | |
| details | No | Optional longer-form content for the "More detail" panel. Markdown supported (headings, bold/italic, lists, links, code, blockquotes). No length limit. | |
| summary | Yes | Update headline shown by default in the Updates tab. Max 280 characters. Markdown supported. | |
| targetDate | No | Optionally update the target date as part of this status post | |
| metricUpdates | No | Current values to record against the goal's metric targets |
TDQS
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.
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.
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.
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.
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.
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"]
})| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | If true, return the resolved mutation payload without submitting | |
| goalId | Yes | Goal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid}) | |
| tagIds | No | Tag IDs to remove. Bypass the name lookup. Provide either tagNames or tagIds. | |
| tagNames | No | Tag 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
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.
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.
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.
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.
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.
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"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (1-100, default: 20) | |
| cursor | No | Pagination cursor from previous response to fetch next page | |
| searchString | Yes | TQL query string. Examples: 'name LIKE "A.1"', 'status = on_track', 'name LIKE "Q4" AND status = on_track' |
TDQS
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.
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.
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.
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.
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.
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"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (1-100, default: 20) | |
| cursor | No | Pagination cursor from previous response to fetch next page | |
| searchString | Yes | TQL query string. Examples: 'name LIKE "Integration"', 'name LIKE "API" OR name LIKE "Migration"' |
TDQS
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.
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.
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.
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.
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.
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.
Markdown — description 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).
Archive — archived: 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" }
})| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New goal name (plain text) | |
| dryRun | No | If true, return the resolved mutation payload without submitting | |
| goalId | Yes | Goal ARI (format: ari:cloud:townsquare:{cloudId}:goal/{uuid}) | |
| ownerId | No | New owner — pass an Atlassian account ID (e.g. "712020:user-uuid-here") | |
| archived | No | Set true to archive the goal, false to unarchive. Destructive in effect — confirm before archiving. | |
| startDate | No | New start date (YYYY-MM-DD) | |
| targetDate | No | New target date | |
| description | No | New goal description (markdown supported, converted to ADF) |
TDQS
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.
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.
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.
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.
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.
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.
15 tool updates
v1.0.0- First observed
add_goal_tags - First observed
delete_latest_goal_update - First observed
edit_goal_update - First observed
get_goal - First observed
get_goals - First observed
get_project - First observed
get_projects - First observed
health_check - First observed
list_goals - First observed
list_projects - First observed
post_goal_update - First observed
remove_goal_tags - First observed
search_goals - First observed
search_projects - First observed
update_goal
TDQS
Scored across 15 tools
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.
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.
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.
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
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
A Model Context Protocol server for Wix AI tools
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceModel 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.1MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that integrates with Atlassian's Jira and Confluence, enabling AI assistants to interact with these tools directly through features like issue management, page creation, and content search.131MIT
- AlicenseNot gradedqualityDmaintenanceA 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.5MIT
- AlicenseNot gradedqualityDmaintenanceA 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 npmISC