flconsole — Upwork jobs
Server Details
Free hosted MCP server: new Upwork jobs for your agent and Telegram alerts within a minute.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- droopboop/flconsole-upwork-mcp
- GitHub Stars
- 0
- Server Listing
- flconsole
TDQS
Scored across 11 tools
Each tool targets a distinct action or resource: feed management (create/update/delete/list), job search (find_jobs/get_job_details), and helpers (find_locations, list_categories, parse_upwork_url, preview_filters, get_usage). Descriptions explicitly differentiate overlapping concepts such as create_feed vs find_jobs and preview_filters vs find_jobs.
All tool names follow a consistent snake_case verb_noun pattern (create_feed, find_jobs, get_job_details, list_feeds, parse_upwork_url, preview_filters, update_feed). No mixing of conventions or vague verbs.
11 tools is well-scoped for an Upwork job search/monitoring server with feeds, filters, and helpers. Each tool has a clear role and none appear redundant.
The surface covers feed CRUD, job search, job details, quota checks, and filter lookup helpers. Minor gaps exist: no tool to retrieve a single feed by ID (list_feeds returns all) and no explicit enumeration for non-category filter options (e.g., job type, experience level), though these may be inferable.
Available Tools
11 toolscreate_feedAInspect
Create a feed: a saved search in the Telegram bot that sends the user a Telegram notification about every new matching job. NOT needed to search or monitor jobs here: use find_jobs with filters for that. Call only after the user explicitly confirmed they want a separate feed with Telegram notifications; "I want jobs about X" is not such a confirmation, so ask first: a feed with Telegram notifications, or jobs only here? Then pass user_confirmed: true. Takes complete filters (base.q is required) and an optional ai_filter.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Up to 40 characters; default: automatic. | |
| filters | Yes | Job filters. Omitted key, null, [] = not set. Booleans: true / false / null (any). | |
| ai_filter | No | Optional AI filter: plain-language rules about which jobs to keep or skip (e.g. "Skip agencies and WordPress; only B2B SaaS"). The bot applies them to every job before the Telegram notification. Use it for the relevance criteria the user gave that structured filters cannot express. | |
| is_active | No | Default true. | |
| user_confirmed | Yes | true only if the user, in this conversation, explicitly agreed to create this feed with Telegram notifications. Otherwise ask them first; never assume. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds real behavioral context beyond that: outbound Telegram notifications per matching job, the ai_filter being applied before each notification, and the user_confirmation gate. It does not say what happens on duplicate feeds or how the feed is later modified/removed (update_feed/delete_feed exist), which keeps it out of 5 territory.
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?
Front-loaded with the definition, then routing guidance, then the confirmation protocol; every sentence carries instruction. The confirmation point is restated ('ask first... never assume' appears in both description and user_confirmed schema text), which is mildly redundant but defensible given the stakes.
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?
A mutation tool with nested filter objects and no output schema, so the description must carry the load — and it covers creation semantics, the confirmation gate, filter completeness, and the AI-filter role. It omits any indication of what is returned (e.g. a feed id) or how the new feed relates to existing ones, a minor gap.
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 would be 3, but the description adds a constraint the schema does not enforce: 'Takes complete filters (base.q is required)' — the schema only marks schema_version as required inside filters. It also flags ai_filter as the channel for criteria structured filters cannot express, which clarifies intent beyond the schema text.
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?
States a specific verb+resource and defines the concept inline ('a feed: a saved search in the Telegram bot that sends the user a Telegram notification about every new matching job'). It also explicitly distinguishes itself from find_jobs, so an agent can route without opening either schema.
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?
Explicitly says when-not to use it ('NOT needed to search or monitor jobs here: use find_jobs with filters') and names the alternative, then adds a hard precondition with a concrete counterexample ('"I want jobs about X" is not such a confirmation'). This is a complete when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_feedADestructiveInspect
Delete a feed. Before calling, name the feed to the user and get their approval, then pass user_confirmed: true. The user is notified in Telegram.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | Feed id from list_feeds. | |
| user_confirmed | Yes | true only if the user, in this conversation, explicitly approved deleting this feed. Otherwise ask them first; never assume. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the danger profile is known. The description adds genuinely new behavioral context: a mandatory user-approval gate and the fact that the user is notified in Telegram, both of which are not derivable from the structured fields. It stops short of stating irreversibility or failure behavior.
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?
Three short sentences, action first, then the safety procedure, then the side effect. No filler and nothing repeated.
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 destructive two-parameter mutation with no output schema, the description covers the action, the required pre-call approval flow, the confirmation flag, and the notification side effect. Nothing an agent needs in order to call it correctly is missing.
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 both parameters are fully documented in the schema, including user_confirmed's "never assume" semantics. The description restates the confirmation requirement but adds no syntax or format detail beyond the schema, 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?
States a specific verb and resource ("Delete a feed"), which is unambiguous against siblings like create_feed and update_feed. However, it never explicitly differentiates itself or names an alternative, so it lands at clear-but-undifferentiated rather than a full 5.
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?
Gives a clear precondition workflow: name the feed to the user, obtain approval, then pass user_confirmed: true. It does not mention when to choose an alternative tool (e.g., update_feed to modify rather than remove), so it stops short of explicit alternatives/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_jobsAInspect
Find new Upwork jobs: the tool for job search and monitoring, safe to call on a schedule. Exactly one source: feed_id (one feed), all_feeds (every feed), or filters (ad hoc, the default: nothing is saved and no feed is needed; pass back cursor from the previous response). Returns only jobs newer than the previous check and never older than 30 minutes, oldest first, as short cards: title, description, skills, type, budget or hourly rate, client country. RULES. 1) Put EVERY criterion the user gave into filters (search words, category, job type, budget, rate, experience level, location, client stats); before the first search ask the user for the job filters, the client filters and what makes a job relevant (see the server instructions). Never request a broad set to filter it yourself: filters matching more than 100 jobs are rejected with filters_too_broad, and jobs over limit are dropped for good (skipped_count). 2) Then judge the returned jobs by title, description and skills. 3) Call get_job_details only for the few jobs worth showing in depth. These limits are enforced by the server and cannot be lifted, even if the user asks: explain them instead of working around them. Limits: one call per 60 s, 100 jobs per hour, 1000 per day.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 10; capped by the remaining quota. | |
| cursor | No | Only with filters: cursor from the previous response. | |
| feed_id | No | Feed id from list_feeds. | |
| filters | No | Job filters. Omitted key, null, [] = not set. Booleans: true / false / null (any). | |
| all_feeds | No | ||
| lookback_minutes | No | Only with filters and without cursor. Default and maximum: 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already covering the safety profile, the description adds substantial behavioral context beyond them: the 30-minute freshness window, oldest-first ordering, per-minute/hour/day rate limits, the filters_too_broad rejection, and that over-limit jobs are dropped permanently (skipped_count). It doesn't explain cursor invalidation or quota-exhaustion behavior, but the disclosure is well above the annotation baseline.
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?
Front-loaded with purpose and source selection, then rules and limits, all of which earn their place. It is dense but not padded; the only cost is length, which is justified by the number of enforced constraints.
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 compensates by specifying the return format (short cards with title, description, skills, type, budget/rate, client country), ordering, and freshness. Missing pieces an agent would need — auth and error semantics — are minor against the enforced-limit disclosure.
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 high (83%), so the baseline is 3; the description still adds real meaning by explaining the mutually exclusive source parameters, that cursor must be passed back from the previous response, and that lookback only applies to filters without a cursor. It does not document the nested filter grammar in depth, but the schema carries that.
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?
Opens with a specific verb+resource ('Find new Upwork jobs') and explicitly scopes itself as 'the tool for job search and monitoring', which separates it from siblings like get_job_details and list_feeds. The three mutually exclusive sources are named inline, so an agent can route correctly without opening the schema.
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?
Gives explicit source selection (feed_id / all_feeds / filters) with filters as the default, then a numbered workflow: put every user criterion into filters, then judge returned jobs, then call get_job_details only for the few worth showing. It also names the constraint (ask the user for filters first, never request broad sets) and the fallback tool for detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_locationsARead-onlyInspect
Find countries, subregions and regions by name or alias substring, for base.location.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds one genuinely behavioral detail beyond the annotations: matching is substring-based across names AND aliases. It says nothing about result limits, ordering, or empty-match behavior.
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?
A single front-loaded sentence: verb, scope of results, matching rule, and target field. No filler, nothing wasted.
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 one-parameter lookup tool without an output schema, the description tells an agent what to pass and what domain it searches, which is nearly sufficient. It does not describe the shape or size of the returned result set, a gap left open by the 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?
Schema coverage is 0% and the single 'query' param has no description, so the description must carry the burden. It does explain what the query is matched against (country/subregion/region names and aliases) and that matching is substring, which is meaningful semantics absent from 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 gives a specific verb (find) and enumerates the exact resource types returned (countries, subregions, regions) plus the matching rule (name or alias substring). It also scopes the result to the base.location field. Siblings (feed/job tools) are unrelated, so no explicit differentiation is needed.
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 phrase 'for base.location' implies the context in which this lookup is useful, but there is no explicit when-to-use/when-not guidance and no named alternative for other location lookups. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_detailsARead-onlyInspect
Full data of jobs returned by find_jobs: experience level, duration, workload, category and client statistics (spend, rating, hire rate, history). Only for jobs already shortlisted by title, description and skills, when the user needs more to decide; never for every job found. Up to 5 upwork_id per call, 30 jobs per hour.
| Name | Required | Description | Default |
|---|---|---|---|
| upwork_ids | Yes | upwork_id values from find_jobs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the extra load and does: it discloses hard operational limits ('Up to 5 upwork_id per call, 30 jobs per hour') and a scoping constraint that prevents bulk lookups. These are exactly the behavioral traits an agent cannot infer from annotations.
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?
Three tight sentences: what it returns, when to use it and when not to, then the rate limits. The scoping rule is front-loaded before the limit, and no sentence is expendable.
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 must enumerate the return shape, and it does (experience level, duration, workload, category, client spend/rating/hire rate/history). Combined with the rate limit and shortlist constraint, an agent has everything needed to call this correctly and sparingly.
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 single parameter already documents its maxItems of 5 and its origin in find_jobs. The description restates the same 5-per-call limit and the id source without adding format, validation, or error semantics beyond the schema, 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?
States a specific verb and resource ('Full data of jobs returned by find_jobs') and enumerates exactly what is returned: experience level, duration, workload, category, client statistics. It explicitly anchors the tool to its sibling find_jobs as the source of the ids, so an agent can tell these two apart without opening schemas.
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?
Gives both when-to-use ('Only for jobs already shortlisted by title, description and skills, when the user needs more to decide') and an explicit exclusion ('never for every job found'). The alternative path (find_jobs) is named as the origin of the input, leaving no routing ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageARead-onlyInspect
Remaining hourly and daily quotas, when the next find_jobs is allowed, feed count and limit.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds valuable behavioral context about quota/rate-limit status and feed limits, which goes beyond the annotations. It does not describe auth needs or exact formats, but for a simple read-only usage tool this is sufficient.
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, dense sentence fragment with no filler. Every element earns its place by naming a distinct piece of returned information.
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, so the description must convey what is returned. It lists the key return values (quotas, next find_jobs allowance, feed count and limit), which is adequate for this simple, parameterless tool. It could be slightly more complete by clarifying formatting or whether all fields are always present, but it covers the essentials.
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?
This tool takes zero parameters, so there is no parameter semantics to document. The baseline of 4 applies when there are no params.
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 the resource clearly: hourly/daily quotas, next find_jobs allowance, and feed count/limit. It is not a full verb phrase, but the tool name and listed outputs make the purpose unambiguous. It also references find_jobs, helping distinguish it from sibling tools.
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 mention of 'when the next find_jobs is allowed' implies the tool is used to check timing before calling find_jobs. However, there is no explicit instruction to use this tool instead of alternatives, and no when-not guidance. This is implied usage rather than clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesARead-onlyInspect
Upwork job categories and subcategories (upwork_id, name) for base.category2_uid / base.subcategory2_uid.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety and locality are covered. The description adds that the payload is id/name pairs, which is useful, but says nothing about whether the list is static, cached, paginated, or how large it is.
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?
A single dense sentence with the resource front-loaded and no filler. The dotted-identifier notation (base.category2_uid) is slightly cryptic for a reader without schema context, but it is compact and 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?
For a 0-param, non-open-world reference list with no output schema, the description covers the essential facts: what it returns and what those IDs are used for. It could say more about whether the list is exhaustive or paginated, but nothing critical is missing.
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?
With zero parameters, the baseline is 4; there is nothing to misinterpret. The description does name the returned fields (upwork_id, name), which is a small bonus but concerns output rather than parameters.
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?
States a specific resource ('Upwork job categories and subcategories') and its returned fields (upwork_id, name), which is clear enough for an agent to know this is a reference-lookup tool. It does not, however, differentiate itself from any sibling by name or scope, so it stops short of a 5.
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 phrase 'for base.category2_uid / base.subcategory2_uid' implies the tool exists to resolve those field values, which is a real usage hint. But there is no explicit when-to-use, no prerequisite statement, and no routing away from alternatives such as find_jobs or preview_filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_feedsBRead-onlyInspect
The user's feeds: id, name, filters, summary, status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered by structured data. The description adds the returned field set, which is mild extra context, but says nothing about scoping to the current user's account explicitly or about pagination/size behavior.
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?
A single terse fragment with no wasted words, and the resource is front-loaded. It is arguably under-specified rather than wordy, but nothing needs trimming.
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, so listing the returned fields (id, name, filters, summary, status) is genuinely useful and partially compensates. Still missing is any indication of ordering, result size, or scoping, which an agent would want before calling a list endpoint.
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 tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. Schema coverage is 100% and the empty schema is self-explanatory.
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?
It identifies the resource ('The user's feeds') and enumerates the fields returned, which implies a read/list operation. However, there is no verb at all, so the agent must infer 'list' from the name and the create/update/delete siblings rather than from the description itself.
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?
No when-to-use guidance, no prerequisites, and no differentiation from siblings such as find_jobs, list_categories, or get_usage. The agent gets no signal about when listing feeds is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_upwork_urlBRead-onlyInspect
Convert an Upwork job search link into filters. 30 calls per hour.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds a concrete rate limit (30 calls per hour), which is genuinely useful context beyond the annotations, but says nothing about the returned filter structure or failure modes.
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 short clauses, the core purpose is front-loaded, and the operational constraint is appended without padding. 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?
For a one-parameter read-only tool, the description covers purpose and rate limits, but with no output schema it should hint at what 'filters' are returned or how they're structured. That omission leaves the agent guessing about the result shape.
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 0% for the single url parameter, so the description must carry meaning. It clarifies that the URL should be an Upwork job search link, which adds real semantic value, but gives no format examples or validation guidance beyond that.
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?
States a specific verb (Convert) and resource (Upwork job search link into filters), which is clear and distinct from siblings like find_jobs or preview_filters. It does not explicitly differentiate itself from those siblings, keeping it short of a 5.
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?
There is no indication of when to use this tool versus alternatives such as preview_filters or find_jobs, nor any prerequisites or exclusions. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_filtersARead-onlyInspect
How many jobs matched the filters in the last window_hours (1-24, default 24) and up to 3 short samples. 10 calls per hour.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | Yes | Job filters. Omitted key, null, [] = not set. Booleans: true / false / null (any). | |
| window_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuinely new operational context: the 10 calls per hour rate limit and the default of 24 hours for window_hours. It does not explain what the returned 'samples' contain, but the added throttling constraint is real value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads what the tool returns and folds in the key constraint (rate limit). No filler or redundancy.
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 read-only preview tool with no output schema, the description conveys the return shape (count plus up to 3 short samples) and the operational limit. The only soft spot is that 'short samples' is not defined, but combined with the rich nested filter schema this is sufficient for correct 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?
Only 2 parameters with 50% schema coverage. The description supplies the window_hours default (24), which the schema omits (it only gives min/max), but the filters object is documented entirely by the nested schema rather than the description. 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?
States a specific behavior: counting jobs matching the filters within a window and returning up to 3 short samples. The agent can tell this is a cheap preview/count tool rather than a full job search, but the description never names or contrasts with its closest sibling (find_jobs).
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?
No when-to-use or when-not-to-use guidance is provided. The rate-limit sentence hints this is a constrained/lightweight call, but there is no explicit routing advice against find_jobs or create_feed, so the agent must infer the role from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_feedAInspect
Change a feed: name, filters and/or is_active (pause/resume). filters REPLACE the saved filters entirely: send the full filters object (get it from list_feeds), not only the changed keys. ai_filter sets or replaces the AI filter, "" removes it; when omitted it is kept. Before calling, show the user what will change and get their approval, then pass user_confirmed: true. The user is notified in Telegram.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| feed_id | Yes | Feed id from list_feeds. | |
| filters | No | Job filters. Omitted key, null, [] = not set. Booleans: true / false / null (any). | |
| ai_filter | No | New AI filter text: REPLACES the saved one (send the full rules; the current text is in list_feeds). Empty string removes it. Omit to keep it. | |
| is_active | No | false pauses, true resumes. | |
| user_confirmed | Yes | true only if the user, in this conversation, explicitly approved this exact change. Otherwise ask them first; never assume. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only readOnlyHint=false, destructiveHint=false, openWorldHint=false. The description goes well beyond them by disclosing that filters and ai_filter REPLACE rather than merge, that an empty string removes the AI filter, that omission preserves it, and that the user is notified in Telegram. These are exactly the mutation semantics an agent needs and that annotations cannot express.
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?
Every sentence carries load: the replacement warning is front-loaded, the confirmation requirement follows, and the side-effect notification closes. No filler, no restatement of the name.
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 6-parameter mutation tool with deeply nested filter objects and no output schema, the description covers the changeable fields, the replacement semantics, the confirmation gate, and the side effect. Nothing needed to invoke it correctly is missing.
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 already 83%, so the baseline is 3, but the description adds real meaning: filters are a full replacement sourced from list_feeds, and ai_filter's replace/remove/keep behavior is spelled out. It stops short of explaining edge cases such as how schema_version interacts with the replacement.
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 precise verb+resource ('Change a feed') and enumerates the mutable fields (name, filters, is_active), including a parenthetical clarifying pause/resume. An agent can distinguish this from create_feed, delete_feed, and list_feeds without inspecting any schema.
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 gives a clear workflow: pull current filters from list_feeds, send the full object, show the user the change, then pass user_confirmed: true. That is strong 'how/when' guidance, though it never explicitly names an alternative tool or states when not to use this one.
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.
11 tool updates
- First observed
create_feed - First observed
delete_feed - First observed
find_jobs - First observed
find_locations - First observed
get_job_details - First observed
get_usage - First observed
list_categories - First observed
list_feeds - First observed
parse_upwork_url - First observed
preview_filters - First observed
update_feed
Related MCP Connectors
The official Upwork MCP server, letting AI agents connect to Upwork and act on your behalf.
19 remote MCP servers on Cloudflare Workers for AI agents. Free tier + Pro API keys.
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that connects AI coding assistants and agentic workflows to the Upwork freelance marketplace. Enables AI-powered job discovery, proposal generation, and contract management through a structured tool interface.MIT
- AlicenseAqualityDmaintenanceAn MCP server that provides AI agents with real-time access to curated Web3 jobs.18MIT
- FlicenseNot gradedqualityFmaintenanceMCP server for the Upwork GraphQL API enabling job search, contract management, proposal drafting, and other Upwork automation tasks via natural language.-
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server for automating Upwork workflows including job search, proposal submission, client communication, and contract management. It provides tools for client vetting, template-based proposals, and session safety with audit logging.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.