Skip to main content
Glama

flconsole — Upwork jobs

Server Details

Free hosted MCP server: new Upwork jobs for your agent and Telegram alerts within a minute.

Ownership verified
Status
Healthy
Uptime
98.2% over 22 days
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

A4/5.0

Scored across 21 tools

Disambiguation4/5

Most tools have clearly distinct roles: feed CRUD (create/update/delete/list), search (find_jobs vs preview_filters vs get_job_details), reference lookups, and context/skill/instruction tools. Mild overlap exists between update_feed and the three set_feed_* tools (both change feed state), and between get_feed_report and tuner_checkin, but descriptions delineate the boundaries well.

Naming Consistency4/5

Nearly all tools follow a clear verb_noun pattern (create_feed, find_jobs, get_job_details, set_feed_alerts, list_categories). The main deviation is tuner_checkin, which drops the verb, plus find_/list_/get_ prefixes used somewhat interchangeably for lookups, but the set is still highly predictable.

Tool Count4/5

21 tools is on the heavy side, but the domain genuinely spans feeds, alerts, tuner workflow, skills/context, quotas, and Upwork reference data. Each tool maps to a distinct operation rather than being padding, though a few (get_usage vs get_feed_report, three set_feed_* variants) could conceivably be folded.

Completeness5/5

Feed lifecycle is fully covered (create, list, update, delete, plus alerts/pause/tuner toggles), and the surrounding surface includes search with cursors, volume preview, URL parsing, detail drill-down, ratings, tuner run logging, agent context/skills, personal instructions, and quota checks. No dead ends for the stated purpose of job search and monitoring.

Available Tools

21 tools
create_feedAInspect

Save a feed: a named search (filters + ai_filter + your agent_notes) to reuse with find_jobs(feed_id). One feed object, two modes: alerts: false (default) = a feed for you only: nothing is sent to Telegram and nothing runs on the server, you apply its ai_filter yourself (up to 5 such feeds); alerts: true = the Telegram bot also sends the user a notification about every new matching job, filtered by the same ai_filter (up to 5 such feeds). Alerts can be switched later with set_feed_alerts. Use alerts: true only when the user explicitly asked for Telegram notifications. Show the search, filters and ai_filter, get the user's approval, then pass user_confirmed: true. Takes complete filters (base.q is required).

NameRequiredDescriptionDefault
nameNoUp to 40 characters; default: automatic.
alertsNoTelegram notifications. Default false: a feed for you only.
filtersYesJob filters. Omitted key, null, [] = not set. Booleans: true / false / null (any).
ai_filterNoOptional AI filter: plain-language Keep / Skip rules (e.g. "Skip agencies and WordPress; only B2B SaaS"), up to 2000 characters. You apply them to the jobs find_jobs returns; with alerts on, the bot also applies them before each Telegram notification. Use it for the relevance criteria that structured filters cannot express.
agent_notesNoYour service notes for this feed: tally of checks, top skip reasons, last review, up to 1500 characters. Replaces the saved text; "" clears it. Not shown in Telegram.
user_confirmedYestrue only if the user, in this conversation, explicitly approved saving this feed (and, with alerts: true, asked for Telegram notifications). Otherwise ask them first; never assume.

TDQS

A4.6/5.0
Behavior4/5

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

Adds substantial context beyond the annotations: alerts:false means nothing runs server-side, alerts:true makes the Telegram bot notify on every match, and each mode caps at 5 feeds. It also discloses the user_confirmed guardrail. It stops short of describing the returned object, but the safety-relevant behavior is well covered.

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

Conciseness4/5

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

Front-loaded with the core purpose before the mode detail. It is long, but nearly every clause carries operational weight (mode differences, limits, approval flow); a touch of density keeps it from a 5.

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

Completeness5/5

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

For a nested-filter creation tool with no output schema, the description covers modes, limits, approval requirements, and ai_filter application semantics. An agent has everything needed to call it correctly and safely.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3, but the description adds meaning: it clarifies base.q is required, explains what ai_filter is for (relevance criteria structured filters can't express) and how user_confirmed must reflect in-conversation approval. Genuinely additive over the schema.

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

Purpose5/5

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

States a specific verb and resource ("Save a feed: a named search (filters + ai_filter + your agent_notes)") and ties it to the sibling it feeds ("reuse with find_jobs(feed_id)"). An agent can distinguish it from list_feeds, update_feed, and set_feed_alerts 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.

Usage Guidelines5/5

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

Explicitly explains the two modes and when to use each: "Use alerts: true only when the user explicitly asked for Telegram notifications," and notes alerts can be toggled later via set_feed_alerts. It also prescribes the approval workflow (show search, filters, ai_filter; get approval; pass user_confirmed: true).

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

delete_feedA
Destructive
Inspect

Delete a feed (alerts on or off). Before calling, name the feed to the user and get their approval, then pass user_confirmed: true. The user is notified in Telegram.

NameRequiredDescriptionDefault
feed_idYesFeed id from list_feeds.
user_confirmedYestrue only if the user, in this conversation, explicitly approved deleting this feed. Otherwise ask them first; never assume.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds important procedural context: explicit user approval is required and the user is notified in Telegram. It could say more about irreversibility, but the safety workflow is well disclosed.

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

Conciseness5/5

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

The description is three short sentences with no wasted language. The destructive action and required approval step are front-loaded.

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

Completeness4/5

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

For a destructive two-parameter tool with complete schema coverage and destructive annotations, the description provides the essential approval and notification context. It does not describe the deletion result or confirm irreversibility, but the available structured fields cover most needs.

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

Parameters3/5

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

Schema description coverage is 100%, so both feed_id and user_confirmed are already documented. The description reinforces the approval protocol for user_confirmed but adds little parameter meaning beyond the schema.

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

Purpose5/5

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

The description states a specific verb and resource: "Delete a feed." It also clarifies that deletion applies regardless of whether alerts are on or off, which distinguishes the action from alert/pause sibling tools.

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

Usage Guidelines4/5

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

It gives a clear pre-call workflow: name the feed to the user, get approval, then pass user_confirmed: true. It does not explicitly mention alternatives such as set_feed_paused or update_feed, but the destructive context is clear.

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: filters (ad hoc, the default: nothing is saved), feed_id (one saved feed, alerts on or off) or all_feeds (every feed that is not paused). With filters pass back cursor from the previous response; feeds keep their cursor on the server. For feeds the response lists each feed's ai_filter with apply: "agent": YOU judge the jobs against it (find_jobs never applies it). A paused feed returns feed_paused. 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 (and feeds with alerts off) 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.

NameRequiredDescriptionDefault
limitNoDefault 10; capped by the remaining quota.
cursorNoOnly with filters: cursor from the previous response.
feed_idNoFeed id from list_feeds.
filtersNoJob filters. Omitted key, null, [] = not set. Booleans: true / false / null (any).
all_feedsNo
lookback_minutesNoOnly with filters, without cursor. Default and maximum: 30.

TDQS

A4.9/5.0
Behavior5/5

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

The description goes far beyond the annotations by disclosing cursor persistence, quota and rate limits (60s/100 jobs per hour/1000 per day), filter-too-broad rejection behavior, skipped_count, paused-feed responses, and the exact output shape and ordering. These are concrete behavioral constraints an agent could not infer from readOnlyHint=false or destructiveHint=false.

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

Conciseness5/5

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

Despite its length, the description is front-loaded with purpose and source selection, then organized into numbered RULES and a final LIMITS line. Every sentence carries operational value, and no filler or redundant restatement of schema fields is present.

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

Completeness5/5

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

For a complex nested-filter tool with no output schema, the description supplies the missing return format, cursor behavior, error cases, rate limits, and agent-judgment workflow. An agent has everything needed to call it correctly and interpret the response.

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

Parameters4/5

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

Schema coverage is high at 83%, so the baseline would be 3, but the description adds critical semantics: exactly one source must be chosen among filters/feed_id/all_feeds, cursor must be passed back only with filters, and feeds keep their cursor server-side. It also tells the agent to put every user criterion into filters, which is meaningful guidance beyond the nested schema fields.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Find new Upwork jobs') and immediately distinguishes its role as a search/monitoring tool from get_job_details, which it says should be used only for in-depth review. An agent can identify the tool's function and primary alternatives without opening any schema.

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

Usage Guidelines5/5

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

It explicitly enumerates the three mutually exclusive modes (filters, feed_id, all_feeds), states which is the default, explains when to ask the user for criteria, and directs the agent to get_job_details only for a few jobs worth showing in depth. It also spells out rate limits and what to do when filters are too broad.

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

find_locationsA
Read-only
Inspect

Find client countries, subregions and regions by name or alias substring (e.g. "united", "EU"). Use the returned values in filters as base.location. Read-only, no hourly quota.

NameRequiredDescriptionDefault
queryYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover readOnlyHint and openWorldHint, so the safety profile is known; the description adds value beyond that by disclosing the rate-limit trait ('no hourly quota') and the intended downstream use of results. Not exhaustive, but genuinely additive context rather than a restatement.

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

Conciseness5/5

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

Three short, front-loaded sentences: what it finds, how to use the result, and the operational caveat. Nothing redundant, and the highest-value information (matching rule) comes first.

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

Completeness4/5

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

With one simple parameter, no output schema, and annotations covering safety, the description supplies nearly everything needed: matching semantics, examples, and result usage. Minor gap is that it does not say what the returned location values look like (code vs. name), which matters for filter construction.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry parameter meaning, and it does: the single 'query' parameter is a substring match against names or aliases, illustrated with 'united' and 'EU'. Length bounds are only in the schema, but the core matching semantics are explained.

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

Purpose5/5

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

States a specific verb and resource (find locations) and narrows the scope to client countries, subregions and regions, plus the matching rule (name or alias substring). No sibling tool overlaps this resource space, so an agent can select it unambiguously.

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

Usage Guidelines4/5

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

Gives clear context for use ('Use the returned values in filters as base.location') and concrete example queries, so the agent knows the intended workflow. It stops short of naming alternatives or stating when not to use it, but no sibling competes for this task.

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

get_agent_contextA
Read-only
Inspect

Call this FIRST in every session. Returns how to work with this server (base_instructions: routing to skills, global rules, limits), the skills index (name, version, when, summary: load the one for the task with get_skill), what is enabled for the user, the user's personal_instructions that you saved in earlier sessions (follow them), all their feeds (alerts on or off, paused, ai_filter, your agent_notes) and the feed limits. Read-only, no hourly quota.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description's 'Read-only' is a restatement, but the added 'no hourly quota' and the instruction to follow saved personal_instructions are genuine behavioral context not in the annotations. It does not discuss error behavior or freshness/caching of the returned context, which is the main remaining gap.

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

Conciseness4/5

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

The directive 'Call this FIRST' is front-loaded, which is exactly right for a session-bootstrapping tool. The single long sentence stuffing five return groups into one string is dense but every clause carries information; only minor readability loss from the run-on structure.

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

Completeness5/5

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

With no output schema, the description carries the full burden of explaining return values, and it enumerates them (base_instructions, skills index fields, enablement, personal_instructions, feeds with their sub-fields, feed limits). For a zero-parameter read tool this is as complete as an agent needs.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4 and the description has nothing to disambiguate. It adds no spurious parameter guidance, which is correct.

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

Purpose5/5

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

The description names a concrete resource — server context, base instructions, skills index, user settings, feeds — and states exactly what each returned section contains. It is clearly distinguishable from siblings like get_skill and get_usage because it explicitly delegates skill loading to get_skill.

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

Usage Guidelines5/5

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

It gives an unambiguous invocation rule: 'Call this FIRST in every session.' It also names the follow-up alternative ('load the one for the task with get_skill'), so the agent knows both when to call this and what to call next.

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

get_feed_reportA
Read-only
Inspect

What a feed did since a time (default: the last tuner run, at most 7 days back): jobs sent (count, last 24 h, recent with titles), opened, jobs a day, the user's 👍/👎 with reasons, notes, titles and source (tg: Telegram buttons, mcp: an agent), ai_skipped (count and examples with the rule), alerts and paused, tuner state and recent_changes (who: user_via_bot, user_via_agent, tuner with run_id, bot_sharpen; before → after). Read-only, no hourly quota.

NameRequiredDescriptionDefault
sinceNoISO 8601 time; default the last tuner run (or 7 days ago).
feed_idYesFeed id from list_feeds.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description consistently adds useful behavioral context: the default window, the 7-day cap, and that it has no hourly quota. It also provides a rich inventory of returned data, though it does not discuss permissions or error behavior.

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

Conciseness4/5

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

The description is dense and front-loads the purpose, then packs the report contents efficiently. It is a long run-on sentence, which slightly hurts readability, but almost every phrase carries concrete information about the report.

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

Completeness4/5

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

There is no output schema, but the description compensates by enumerating the major returned fields and their semantics, including source values and tuner change attribution. Combined with complete parameter coverage and clear safety annotations, it gives the agent enough to call the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented. The description reinforces the meaning of 'since' and its default/limit, but does not materially extend parameter semantics beyond the schema, so it stays at the baseline.

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

Purpose5/5

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

The description states a very specific report scope: what a feed did since a time, with an explicit enumeration of contents (jobs sent, opened, thumbs, ai_skipped, alerts, tuner state, recent changes). This clearly distinguishes it from operational siblings like create_feed or find_jobs and from usage/quota tools.

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

Usage Guidelines3/5

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

The description implies when to use it by defining the report window and noting it is read-only with no hourly quota. However, it does not explicitly contrast the tool with siblings such as get_usage, get_job_details, or find_jobs, so the agent must infer the best alternative.

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

get_job_detailsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
upwork_idsYesupwork_id values from find_jobs.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description layers on genuinely new operational constraints the annotations do not carry: a hard cap of 5 upwork_id per call and a throttle of 30 jobs per hour. Disclosing rate limits and batch ceilings is precisely the context annotations cannot convey.

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

Conciseness4/5

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

Three compact sentences, front-loaded with what data is returned, then when to use it, then operational limits. The field enumeration is long but each item is informative; no filler or repetition.

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

Completeness5/5

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

With no output schema, the description still tells the agent what comes back, where the input IDs must come from, when the tool is appropriate, and the rate/batch limits. Nothing an agent needs in order 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.

Parameters3/5

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

Schema description coverage is 100%, so the single parameter and its 1-5 array bounds are already fully documented in the schema, establishing the baseline of 3. The description restates the 'Up to 5 upwork_id per call' bound and the find_jobs provenance, which is mildly reinforcing but adds no new syntax or format meaning.

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

Purpose5/5

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

States a specific verb+resource ('Full data of jobs') and enumerates exactly what the payload contains (experience level, duration, workload, category, client statistics). It explicitly positions itself relative to the sibling find_jobs by scoping to jobs that tool already returned, so an agent can distinguish the two without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit positive condition ('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 routing rule between find_jobs and get_job_details is unambiguous.

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

get_skillA
Read-only
Inspect

Load a skill: step-by-step instructions for one kind of task. Names and when to use each are in the skills index of get_agent_context (agent, feed-tuner, filter-writing, job-scout, ratings, telegram-setup). Load the skill before you act on that task, once per session. Read-only, no hourly quota.

NameRequiredDescriptionDefault
nameYesSkill name from the skills index, e.g. job-scout.

TDQS

A4.6/5.0
Behavior4/5

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 context: no hourly quota (rate-limit behavior not in annotations) and a once-per-session caching rule. It stops short of describing what the returned skill payload looks like or its size, but the safety and cost profile is well covered.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core purpose, then discovery pointer, then timing. The parenthetical name list is the only length and it earns its place by supplying valid values.

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

Completeness4/5

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

For a one-parameter read tool with no output schema, the description covers what it returns at a high level ('step-by-step instructions'), where to find names, and when to call it. A brief note on how large or how structured the returned skill content is would close the remaining gap.

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

Parameters4/5

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

Schema coverage is 100% and the single parameter is fully self-documented, so the baseline is 3. The description exceeds that by enumerating the valid skill names (agent, feed-tuner, filter-writing, job-scout, ratings, telegram-setup), which the schema does not provide and which functions as an effective value guide.

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

Purpose5/5

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

States a specific verb and resource ('Load a skill') and immediately defines what a skill is ('step-by-step instructions for one kind of task'). It also distinguishes itself from get_agent_context by pointing there for the index of names, so an agent can tell the two apart 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.

Usage Guidelines5/5

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

Gives explicit timing ('Load the skill before you act on that task, once per session') and routes discovery to the alternative tool ('Names and when to use each are in the skills index of get_agent_context'). The relationship between lookup-by-index and load-by-name is unambiguous.

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

get_usageA
Read-only
Inspect

Remaining hourly and daily quotas, when the next find_jobs is allowed, feed counts and limits (alerts on and off).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so safety behavior is covered. The description adds useful return-content context by listing quotas, next find_jobs eligibility, feed counts, and alert-state limits, though it does not describe response structure or quota-reset semantics.

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

Conciseness4/5

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

It is a single efficient sentence with no filler. The comma-separated list is compact and front-loads the main quota information, though the telegraphed style is slightly less readable than a full sentence.

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

Completeness4/5

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

For a zero-parameter, read-only usage endpoint with no output schema, the description covers the key returned values an agent would need. It could say more about response shape or quota reset timing, but it is sufficient for correct invocation.

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

Parameters4/5

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

The tool has zero parameters, so there are no parameter semantics to explain. The baseline for a no-parameter tool is 4, and nothing in the description creates ambiguity about inputs.

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

Purpose4/5

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

The description specifically names the returned information: remaining hourly/daily quotas, next allowed find_jobs time, feed counts, and limits with alert status. It is clearly a usage/quota inspection tool, though the telegraphic noun-phrase style lacks a direct verb and does not explicitly contrast with sibling tools.

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

Usage Guidelines3/5

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

The phrase 'when the next find_jobs is allowed' implies the tool is useful before calling find_jobs, but it never states when to use this tool or when to prefer an alternative. Usage is inferable but not explicitly guided.

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

list_categoriesA
Read-only
Inspect

List Upwork job categories and their subcategories (upwork_id, name). Use the upwork_id values in filters as base.category2_uid / base.subcategory2_uid. Read-only, no hourly quota.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the 'Read-only' phrasing is largely redundant. However, 'no hourly quota' is genuinely new behavioral information not present in the annotations, telling the agent this call is cheap and safe to repeat.

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

Conciseness5/5

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

Two tight sentences: the first defines output, the second tells the agent how to use it. The most actionable guidance (ID usage) is front-loaded after the purpose statement, with zero filler.

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

Completeness5/5

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

No input params and no output schema, but the description names the returned fields and their intended use, which is all an agent needs for a static reference lookup. Nothing required to invoke or consume the result correctly is missing.

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

Parameters4/5

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

Zero parameters, so per the rubric the baseline is 4. The description goes slightly beyond by explaining how the returned upwork_id maps into other tools' filter parameters, though it adds nothing about call syntax because there is none.

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

Purpose5/5

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

States a specific verb (List) and resource (Upwork job categories and their subcategories) and names the returned fields (upwork_id, name). An agent can distinguish this lookup tool from siblings like find_jobs or get_job_details without opening any schema.

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

Usage Guidelines4/5

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

Gives concrete downstream usage: 'Use the upwork_id values in filters as base.category2_uid / base.subcategory2_uid', which tells the agent when this lookup is needed before filtering. It stops short of naming alternatives or exclusions, so it does not reach a full 5.

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

list_feedsA
Read-only
Inspect

List all the user's feeds: id, name, alerts (Telegram notifications on or off), paused, filters, plain-text summary, ai_filter, your agent_notes, and the limits for feeds with and without alerts. Call it to get a feed_id for find_jobs or any feed change. Read-only, no hourly quota.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces this with "Read-only." It adds useful operational context that is not in annotations: "no hourly quota," plus the returned feed attributes and limits.

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

Conciseness5/5

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

The description is front-loaded with the action and result fields, followed by a clear usage trigger and a short operational note. The field list is dense but purposeful, with no filler.

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

Completeness5/5

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

With no output schema, the description appropriately enumerates the key returned fields, including id, name, alerts, paused, filters, summary, ai_filter, agent_notes, and limits. Combined with annotations and the zero-parameter schema, an agent has enough information to call it correctly.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics gap; baseline 4 applies. The description does not need to explain inputs beyond the empty schema.

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

Purpose5/5

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

States a specific verb and resource ("List all the user's feeds") and enumerates the returned fields, making the tool's scope precise. It also distinguishes itself from nearby tools by naming find_jobs and general feed changes as follow-up consumers.

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

Usage Guidelines4/5

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

Explicitly says when to call it: to obtain a feed_id for find_jobs or any feed change. It does not enumerate when not to use it or name every alternative, but the intended usage context is clear.

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

log_tuner_runAInspect

End of a tuner run for one feed, also when nothing changed. findings: short notes for the next run (not shown to the user). If the run changed the feed, change and reason are shown to the user in Telegram word for word with an Undo button: one plain sentence each. open_question: what to ask the user next time. The server sets the next check. 30 storage changes an hour.

NameRequiredDescriptionDefault
changeNo
reasonYes
run_idYesrun_id from tuner_checkin.
feed_idYesFeed id from list_feeds.
findingsYes
open_questionNo

TDQS

A4.2/5.0
Behavior5/5

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

Beyond annotations, it discloses user-visible side effects in Telegram, presence of an Undo button, that findings are not shown to users, that the server sets the next check, and a storage-change rate limit. These are exactly the behavioral details an agent needs before invoking a write tool.

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

Conciseness4/5

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

The description is compact and front-loads the core purpose, with each detail carrying useful meaning. It is somewhat run-on and could be structured more cleanly, but it avoids wasted text.

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

Completeness4/5

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

For a write tool with no output schema and partial parameter descriptions, it covers purpose, key field semantics, user-visible effects, and rate limits well. It does not describe what the call returns or edge cases like duplicate run logging, leaving minor gaps.

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

Parameters4/5

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

Schema coverage is only 33%, but the description meaningfully explains findings, change, reason, and open_question semantics, including user visibility and one-sentence formatting. It relies on the schema for run_id and feed_id, and does not fully clarify required reason vs optional change.

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

Purpose4/5

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

The description states a specific endpoint action: ending/logging a tuner run for one feed, including no-change runs. It is clearly distinct from tuner_checkin by timing, though it does not explicitly name that sibling.

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

Usage Guidelines4/5

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

It clearly says to use this at the end of a tuner run and even when nothing changed, which is important usage context. It lacks explicit exclusions or a direct comparison to tuner_checkin, so it stops short of full routing guidance.

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

parse_upwork_urlA
Read-only
Inspect

Convert an Upwork job search link (upwork.com/nx/search/jobs/?...) into flconsole filters. Use it when the user already has a search on Upwork; pass the result to preview_filters, find_jobs or create_feed. Read-only. 30 calls per hour.

NameRequiredDescriptionDefault
urlYes

TDQS

A4.6/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description reinforces this with 'Read-only' plus a concrete rate limit ('30 calls per hour') that annotations do not cover. It stops short of describing failure behavior for malformed or non-search URLs, but adds real operational context beyond the structured fields.

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

Conciseness5/5

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

Three short sentences, front-loaded with the transformation, then usage, then routing, then constraints. No waste.

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

Completeness4/5

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

For a single-param, read-only converter with no output schema, the description supplies input format, routing guidance, and rate limits. A brief note on what the returned filters look like or error handling would close the remaining gap.

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

Parameters4/5

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

Schema coverage is 0% and the schema only gives length bounds, so the description carries the burden; it usefully characterizes the input as an 'upwork.com/nx/search/jobs/?...' link, which tells the agent the expected format. It still doesn't state what constitutes an invalid or unsupported URL, so it is not fully compensating.

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

Purpose5/5

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

States a specific verb (convert) and resource (Upwork job search link → flconsole filters) with the exact URL shape named. An agent can distinguish it from parsing tools like get_job_details or find_locations 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.

Usage Guidelines5/5

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

Explicitly states when to use it ('when the user already has a search on Upwork') and names three concrete downstream alternatives (preview_filters, find_jobs, create_feed). Nothing is left to inference.

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

preview_filtersA
Read-only
Inspect

Volume check for filters before find_jobs or create_feed: how many jobs matched in the last window_hours (1-168, default 168 = 7 days), per UTC day, and up to 3 newest short samples. Response: matched_count = total in the window; per_day_avg = average per day (matched_count / (window_hours / 24)); by_day = [{date, count, partial}] per UTC calendar day, oldest first, summing to matched_count; partial: true marks the first day (when the window starts mid-day) and today, so compare full days only. Tell the user the volume as "N jobs in 7 days, ~M a day" and point out busy or quiet days. 10 calls per hour: change several filters between calls.

NameRequiredDescriptionDefault
filtersYesJob filters. Omitted key, null, [] = not set. Booleans: true / false / null (any).
window_hoursNoDefault 168 (7 days).

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already establish it as a read-only, closed-world operation, and the description layers on what annotations cannot express: a hard quota of 10 calls per hour, the exact response fields and their arithmetic (per_day_avg = matched_count / (window_hours/24)), and the caveat that the first day and today are partial and should not be compared to full days.

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

Conciseness4/5

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

Purpose is front-loaded, followed by response semantics, user-facing guidance, and the rate limit. It is dense but nearly every clause carries information; the 'tell the user the volume as N jobs in 7 days' sentence is presentation guidance that borders on instruction creep but still serves the preview workflow.

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

Completeness5/5

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

For a read-only preview tool with no output schema, the description fully specifies the return shape, the units, the ordering, and the partial-day caveat, plus the throughput limit. Nothing an agent needs in order to call it and interpret the result is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by explaining how window_hours changes the derived math and why partial-day flags appear when the window starts mid-day. The nested filters object itself is fully documented in the schema, so no extra compensation is needed there.

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

Purpose5/5

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

States a specific operation (volume check / count of matched jobs) on a specific resource (feed filters) and positions it relative to siblings find_jobs and create_feed in the first sentence. An agent can distinguish it from find_jobs 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.

Usage Guidelines4/5

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

Explicitly says to run it 'before find_jobs or create_feed', which supplies ordering and context. It adds a rate-limit-derived hint (change several filters between calls), though it does not state exclusions such as when a preview is unnecessary or what to do if volume is zero.

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

rate_jobAInspect

Record the user's own 👍/👎 on one specific job, the same as the 👍/👎 buttons under a Telegram alert: it feeds the bot's offer to make the feed sharper and the feed tuner. Only when the user, in their own words, said what they think of that job; never from your own judgement (write that to agent_notes), never in bulk. feed_id: the user's feed the job came from (matched_feeds in find_jobs, or the feed of the Telegram alert); job: its upwork_id. A job from find_jobs with ad hoc filters has no feed: do not rate it. reason is required for "down": skill (not my kind of work), budget (pay too low), client (client looks bad), other. note: the user's words in short. Rating again replaces the earlier one. Counts as a storage change (30 an hour).

NameRequiredDescriptionDefault
jobYesThe job's upwork_id.
noteNoOptional: the user's words in short, up to 300 characters.
ratingYes
reasonNoRequired for down; ignored for up.
feed_idYesFeed id from list_feeds.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only say readOnly=false, destructive=false, openWorld=false; the description adds substantially more — re-rating replaces the earlier rating, and it counts as a storage change with a 30/hour budget. That mutation and rate-limit context is exactly what an agent needs and is not in the annotations.

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

Conciseness4/5

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

Front-loaded with the verb and resource, and nearly every clause carries a constraint or disambiguation that earns its place. It is one dense run-on block though, so the parameter guidance would be easier to scan if separated from the usage rules.

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

Completeness5/5

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

For a mutation tool with no output schema, it covers everything: what gets stored, replacement behavior, rate limits, provenance of feed_id and job, and the conditional requirement on reason. 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.

Parameters5/5

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

Adds real meaning beyond the 80%-covered schema: where feed_id must come from (matched_feeds in find_jobs or the alert's feed), that job is the upwork_id, the semantics of each reason enum value (skill/budget/client/other), and that note should be the user's own words. The enum meanings appear nowhere in the schema.

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

Purpose5/5

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

States a specific verb and resource — recording the user's own thumbs up/down on one job — and immediately names the equivalent UI affordance (the buttons under a Telegram alert) plus what consumes the signal (offer/feed tuner). This clearly separates it from siblings like find_jobs, get_job_details, and set_feed_tuner.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions (only when the user stated their opinion in their own words), explicit when-not (never from the agent's own judgement — route that to agent_notes; never in bulk), and a concrete exclusion (jobs from find_jobs with ad hoc filters have no feed and must not be rated).

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

save_agent_instructionsAInspect

Save your personal instructions about this user on the server, so any agent they start later continues with the same context: preferences, rates, red flags, proposal style, conclusions of reviews. mode "append" adds a new point, "replace" rewrites the whole text (use it to condense). Up to 6000 characters in total: keep it short and current. No secrets or third-party personal data. Tell the user what you saved. 30 storage changes per hour.

NameRequiredDescriptionDefault
modeNoDefault replace.
textYesreplace: the full new text ("" clears it); append: the new part only. The whole text: up to 6000 characters.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses a 6000-character budget, a 30-storage-changes-per-hour rate limit, the PII/secret prohibition, and the expectation to tell the user what was saved. Annotations only cover mutation/openWorld flags, so this extra context is genuinely additive rather than redundant.

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

Conciseness5/5

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

Front-loads the purpose and payoff, then compresses mode semantics, limits, content policy, and user-facing behavior into short clauses with zero filler. Every sentence carries an instruction the agent needs.

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

Completeness5/5

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

For a two-parameter write tool with no output schema, the description covers limits, rate limiting, mode semantics, acceptable content, and even the post-call user interaction. Nothing an agent needs 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning: 'append' adds a new point versus 'replace' rewriting and being the tool for condensing. It also clarifies the 6000-character total against the schema's 20000 maxLength, removing an ambiguity the schema alone would leave.

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

Purpose5/5

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

States a specific verb and resource ('Save your personal instructions about this user on the server') plus the payoff ('so any agent they start later continues with the same context'), and enumerates what belongs in it (preferences, rates, red flags, proposal style). An agent can distinguish this from get_agent_context or save_setup without opening any schema.

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

Usage Guidelines4/5

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

Gives clear operational guidance: append adds a point, replace rewrites the whole text and is the choice for condensing, plus content rules (keep short and current, no secrets or third-party personal data). It does not explicitly name the read-side sibling (get_agent_context) or state when not to save, which keeps it from a 5.

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

set_feed_alertsAInspect

Turn Telegram notifications for a feed on (on: true) or off (on: false). On: the bot sends the user every new matching job, filtered by the feed's ai_filter; needs a free slot (up to 5 feeds with alerts) or fails with feed_limit_reached. Off: the feed stays for you only (up to 5 such feeds). Ask the user first, then pass user_confirmed: true. The user is notified in Telegram.

NameRequiredDescriptionDefault
onYestrue: Telegram alerts on; false: off.
feed_idYesFeed id from list_feeds.
user_confirmedYestrue only if the user, in this conversation, explicitly asked to turn alerts on or off. Otherwise ask them first; never assume.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare the tool is not read-only and not destructive; the description goes well beyond by disclosing quota ceilings (5 alerted feeds, 5 private feeds), the exact failure mode 'feed_limit_reached', ai_filter-mediated delivery, and the Telegram side effect of notifying the user.

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

Conciseness5/5

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

Front-loaded purpose, then parallel 'On:'/'Off:' branches, then the confirmation rule. Dense but every clause carries operational information (limits, failure name, filtering, notification) with no filler.

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

Completeness5/5

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

No output schema exists, and the description compensates by naming the error condition the caller may receive; quota, filtering behavior, confirmation requirement, and side effects are all covered for a 3-parameter mutation.

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

Parameters4/5

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

Schema coverage is 100% and already documents all three parameters, so a 3 baseline applies; the description adds genuine value by explaining the downstream consequence of each `on` value and the conversational precondition behind `user_confirmed`.

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

Purpose5/5

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

States a specific verb and resource ('Turn Telegram notifications for a feed on/off') and immediately clarifies what each state means, including that turning alerts off leaves the feed intact — which separates it from delete_feed and set_feed_paused without naming them.

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

Usage Guidelines5/5

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

Gives explicit conditions for each parameter value (on: true sends every new matching job; on: false keeps the feed private), states the prerequisite slot limits, and adds a hard procedural rule ('Ask the user first, then pass user_confirmed: true').

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

set_feed_pausedAInspect

Pause (paused: true) or resume (paused: false) a feed. A paused feed is used by nobody: no Telegram alerts and find_jobs returns feed_paused. Resuming returns only new jobs from now on. For a feed with alerts on ask the user first and pass user_confirmed: true.

NameRequiredDescriptionDefault
pausedYestrue pauses, false resumes.
feed_idYesFeed id from list_feeds.
user_confirmedNotrue only if the user, in this conversation, explicitly approved pausing or resuming it. Otherwise ask them first; never assume.

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (which only mark this as a non-read-only, non-destructive, closed-world write), the description discloses the operational consequences: no Telegram alerts, find_jobs returns feed_paused, and resuming will only deliver new jobs from that point forward rather than backfilling. It also states the human-confirmation policy, which is critical context for an agent.

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

Conciseness5/5

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

Three short sentences, front-loaded with the action and direction, followed by consequences and then the confirmation rule. Every sentence carries decision-relevant information with no filler.

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

Completeness5/5

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

For a three-parameter state-changing tool with no output schema, the description covers the action, side effects, downstream effects on other tools, and the human-confirmation requirement. Nothing an agent needs in order 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful guidance on user_confirmed as an operational policy (ask the user first; never assume) rather than just restating the field. The paused parameter's semantics are repeated from the schema, which is minor redundancy.

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

Purpose5/5

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

The description uses a precise verb pair (pause/resume) and names the resource (a feed), including the exact parameter values that select each direction. It also distinguishes this tool's effect from siblings like set_feed_alerts and delete_feed by explaining that a paused feed receives no alerts and that find_jobs reports feed_paused.

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

Usage Guidelines4/5

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

It gives a clear conditional prerequisite: if the feed has alerts on, ask the user first and pass user_confirmed: true. It does not, however, contrast this with alternatives such as deleting or updating a feed, so the choice between siblings is left implicit.

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

set_feed_tunerAInspect

Turn the feed tuner on or off for a feed with Telegram alerts. on: true needs target_band (jobs a day) and the user's clear yes in this conversation (user_confirmed: true): that yes is the standing consent for tuner changes within the feed-tuner rules. on: false needs no confirmation. The user is told in Telegram. Counts as a feed change.

NameRequiredDescriptionDefault
onYes
feed_idYesFeed id from list_feeds.
target_bandNoJobs a day the user wants from this feed, e.g. {"min": 5, "max": 15}.
user_confirmedNotrue only if the user, in this conversation, explicitly agreed to the tuner on this feed.

TDQS

A4/5.0
Behavior4/5

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

Beyond the annotations, the description discloses important behavioral traits: user confirmation is required for enabling, disabling requires no confirmation, the user is notified via Telegram, and the action counts as a feed change. It does not explain effects on existing tuner runs or how changes can be reverted.

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

Conciseness4/5

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

The description is short and front-loaded, with the on/off conditions stated clearly. It is slightly dense but contains no redundant filler.

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

Completeness4/5

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

For a mutation tool with no output schema and a nested parameter, the description covers the key prerequisites, side effects, and consent model. It leaves some gaps around how the tuner interacts with related feed settings, but the core information needed to call it correctly is present.

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

Parameters4/5

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

Schema coverage is 75%, but the description adds conditional meaning not expressed in the schema: target_band is required when on is true, and user_confirmed represents explicit consent in the current conversation. This is meaningful semantic guidance beyond the field descriptions.

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

Purpose4/5

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

The description states a specific verb and resource: turning the feed tuner on or off for a feed, with Telegram alerts. It is clear enough to distinguish from broad siblings like update_feed, but it does not explicitly distinguish itself from set_feed_alerts or set_feed_paused.

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

Usage Guidelines4/5

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

It gives concrete when-to-use conditions for both on: true and on: false, including the confirmation requirement and target_band requirement. It does not name alternative tools or state when this tool should not be used instead of related feed-setting tools.

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

tuner_checkinBInspect

Start of every feed tuner run (the scheduled task "Run flconsole feed tuner check"). For each feed with the tuner on: due, stage, target_band, notes, next_check_at, since and, when due, run_id. Nothing due → stop at once. The server sets the pace; do not run extra checks. Read-only, no hourly quota.

NameRequiredDescriptionDefault
feed_idsNoOnly these feeds (if the task prompt names them).

TDQS

B3.2/5.0
Behavior1/5

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

The description asserts 'Read-only' while annotations declare readOnlyHint=false, a direct conflict about whether the call changes state. Because the structured annotation is the authoritative signal, an agent cannot tell whether check-in itself records anything. The otherwise useful notes about server-driven pacing and no hourly quota are outweighed by this contradiction.

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

Conciseness3/5

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

It is short and front-loads the run-start purpose, which is good. However the field list is a comma run-on and the phrase 'since and, when due, run_id' is grammatically broken and ambiguous about which fields are always returned versus conditional. Tightening that fragment would make the definition noticeably clearer.

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

Completeness4/5

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

There is no output schema, so the description usefully names the returned fields and the early-exit case, and it warns that the server controls pacing. The remaining gap is the contradiction about read-only behavior and the absence of any pointer to the tool that records results afterward.

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

Parameters3/5

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

Schema description coverage is 100% and the single feed_ids parameter is documented there, including its 'Feed id from list_feeds' source and the 50-item cap. The description adds a usage nuance (only when the task prompt names them) but no format or semantics beyond the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

The description gives a specific verb-plus-resource framing: it is the entry point of a feed tuner run (the scheduled 'Run flconsole feed tuner check' task) and it returns per-feed tuner state. It also enumerates the returned fields (due, stage, target_band, notes, next_check_at, since, run_id), so an agent knows what it gets. It stops short of naming the complementary sibling (log_tuner_run) to close the loop.

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

Usage Guidelines4/5

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

Clear triggers and stop conditions are stated: it belongs at the start of every tuner run, 'Nothing due → stop at once', and 'do not run extra checks'. The scope note that feed_ids applies only when the task prompt names feeds is also a usage rule. It does not explicitly route to the follow-up tool (log_tuner_run) that presumably closes a run.

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, ai_filter and/or agent_notes. 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; omitted fields are kept. A feed with alerts on sends Telegram notifications: show the user what will change and pass user_confirmed: true (they are notified in Telegram). A feed with alerts off and agent_notes need no confirmation. Updating only agent_notes counts as a storage change (30 an hour), the rest as a feed change (20 an hour).

NameRequiredDescriptionDefault
nameNo
run_idNoTuner runs only: run_id from tuner_checkin instead of user_confirmed. Only search, filters, ai_filter and agent_notes; at most 3 edits per run in total.
feed_idYesFeed id from list_feeds.
filtersNoJob filters. Omitted key, null, [] = not set. Booleans: true / false / null (any).
ai_filterNoNew 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.
agent_notesNoYour service notes for this feed: tally of checks, top skip reasons, last review, up to 1500 characters. Replaces the saved text; "" clears it. Not shown in Telegram.
user_confirmedNotrue only if the user, in this conversation, explicitly approved this exact change. Otherwise ask them first; never assume.

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=false), the description discloses the critical replacement semantics ('filters REPLACE the saved filters entirely'), that omitted keys are kept, that Telegram notifications fire when alerts are on, and the concrete rate limits (30/hr storage edits, 20/hr feed edits). These are exactly the operational facts an agent needs and cannot infer from the schema.

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

Conciseness4/5

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

The description is dense but front-loaded: verb and fields first, then the replacement hazard, then the confirmation rule, then the rate limits. Every sentence carries an operational rule, though the final rate-limit sentence is compressed enough to require careful parsing.

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

Completeness4/5

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

For a 7-parameter mutation with nested filter objects, the description covers the risky behavior (replacement), confirmation policy, and cost model well. Since no output schema exists, the description does not say what an update returns or how to verify the change, which is the one remaining gap.

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

Parameters4/5

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

Schema coverage is already 86%, yet the description still adds real meaning: filters must be sent whole rather than as a patch, ai_filter with an empty string removes it, agent_notes-only edits bill as a storage change, and user_confirmed is conditional on explicit user approval. run_id and its tuner-specific constraints are left entirely to the schema.

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

Purpose4/5

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

The description opens with a specific verb and resource ('Change a feed') and enumerates the mutable fields (name, filters, ai_filter, agent_notes), which is enough to distinguish it from create_feed/delete_feed. It never explicitly names those siblings, 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.

Usage Guidelines4/5

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

It gives concrete when-to-use rules: pass user_confirmed only after showing the user the change when alerts are on, while an alerts-off feed or agent_notes-only edit needs no confirmation. It also routes the agent to list_feeds for the current filters. No guidance on when to prefer an alternative sibling (e.g., delete_feed, set_feed_alerts) for related operations.

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

Tool Schema Changelog

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

  1. 5 tool updates
    • Addedget_feed_report
    • Addedlog_tuner_run
    • Addedset_feed_tuner
    • Addedtuner_checkin
    • Changedupdate_feed1 field changed
      • addedInput schema / properties / run_id
        Added value: +{
        +  "description": "Tuner runs only: run_id from tuner_checkin instead of user_confirmed. Only search, filters, ai_filter and agent_notes; at most 3 edits per run in total.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
  2. 2 tool updates
    • Addedget_skill
    • Addedrate_job
  3. 8 tool updates
    • Changedcreate_feed5 fields changed
      • addedInput schema / properties / agent_notes
        Added value: +{
        +  "description": "Your service notes for this feed: tally of checks, top skip reasons, last review, up to 1500 characters. Replaces the saved text; \"\" clears it. Not shown in Telegram.",
        +  "maxLength": 20000,
        +  "type": "string"
        +}
      • changedInput schema / properties / ai_filter / description
        Previous value: -"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."New value: +"Optional AI filter: plain-language Keep / Skip rules (e.g. \"Skip agencies and WordPress; only B2B SaaS\"), up to 2000 characters. You apply them to the jobs find_jobs returns; with alerts on, the bot also applies them before each Telegram notification. Use it for the relevance criteria that structured filters cannot express."
      • addedInput schema / properties / alerts
        Added value: +{
        +  "description": "Telegram notifications. Default false: a feed for you only.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / is_active
        Removed value: -{
        -  "description": "Default true.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / user_confirmed / description
        Previous value: -"true only if the user, in this conversation, explicitly agreed to create this feed with Telegram notifications. Otherwise ask them first; never assume."New value: +"true only if the user, in this conversation, explicitly approved saving this feed (and, with alerts: true, asked for Telegram notifications). Otherwise ask them first; never assume."
    • Removeddelete_setup
    • Changedfind_jobs3 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Only with filters or setup_id: cursor from the previous response."New value: +"Only with filters: cursor from the previous response."
      • changedInput schema / properties / lookback_minutes / description
        Previous value: -"Only with filters or setup_id, without cursor. Default and maximum: 30."New value: +"Only with filters, without cursor. Default and maximum: 30."
      • removedInput schema / properties / setup_id
        Removed value: -{
        -  "description": "Setup id from list_setups.",
        -  "minimum": 1,
        -  "type": "integer"
        -}
    • Removedlist_setups
    • Removedsave_setup
    • Addedset_feed_alerts
    • Addedset_feed_paused
    • Changedupdate_feed3 fields changed
      • addedInput schema / properties / agent_notes
        Added value: +{
        +  "description": "Your service notes for this feed: tally of checks, top skip reasons, last review, up to 1500 characters. Replaces the saved text; \"\" clears it. Not shown in Telegram.",
        +  "maxLength": 20000,
        +  "type": "string"
        +}
      • removedInput schema / properties / is_active
        Removed value: -{
        -  "description": "false pauses, true resumes.",
        -  "type": "boolean"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "feed_id",
        -  "user_confirmed"
        -]New value: +[
        +  "feed_id"
        +]
  4. 2 tool updates
    • Changedsave_agent_instructions2 fields changed
      • changedInput schema / properties / text / description
        Previous value: -"replace: the full new text (\"\" clears it); append: the new part only."New value: +"replace: the full new text (\"\" clears it); append: the new part only. The whole text: up to 6000 characters."
      • changedInput schema / properties / text / maxLength
        Previous value: -12000New value: +20000
    • Changedsave_setup4 fields changed
      • changedInput schema / properties / ai_criteria / description
        Previous value: -"The user's relevance criteria in plain words (Keep / Skip) that you apply to each job. Replaces the saved text; \"\" clears it."New value: +"The user's relevance criteria in plain words (Keep / Skip) that you apply to each job, up to 2000 characters. Replaces the saved text; \"\" clears it."
      • changedInput schema / properties / ai_criteria / maxLength
        Previous value: -4000New value: +20000
      • changedInput schema / properties / notes / description
        Previous value: -"Your notes for this setup: tally of checks, skip reasons, last review. Replaces; \"\" clears."New value: +"Your notes for this setup: tally of checks, skip reasons, last review, up to 1500 characters. Replaces; \"\" clears."
      • changedInput schema / properties / notes / maxLength
        Previous value: -4000New value: +20000
  5. 6 tool updates
    • Addeddelete_setup
    • Changedfind_jobs3 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Only with filters: cursor from the previous response."New value: +"Only with filters or setup_id: cursor from the previous response."
      • changedInput schema / properties / lookback_minutes / description
        Previous value: -"Only with filters and without cursor. Default and maximum: 30."New value: +"Only with filters or setup_id, without cursor. Default and maximum: 30."
      • addedInput schema / properties / setup_id
        Added value: +{
        +  "description": "Setup id from list_setups.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
    • Addedget_agent_context
    • Addedlist_setups
    • Addedsave_agent_instructions
    • Addedsave_setup
  6. 1 tool update
    • Changedpreview_filters2 fields changed
      • addedInput schema / properties / window_hours / description
        Added value: +"Default 168 (7 days)."
      • changedInput schema / properties / window_hours / maximum
        Previous value: -24New value: +168
  7. 11 tool updates
    • First observedcreate_feed
    • First observeddelete_feed
    • First observedfind_jobs
    • First observedfind_locations
    • First observedget_job_details
    • First observedget_usage
    • First observedlist_categories
    • First observedlist_feeds
    • First observedparse_upwork_url
    • First observedpreview_filters
    • First observedupdate_feed

Publisher details

Operator
flconsole · Publisher source
Operator website
https://flconsole.com
Vendor relationship
Independent
Trust center
Not available
Restrictions
No paid plan and no API key. Sign-in with Telegram (OAuth); manual personal token available for clients without OAuth.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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
  • F
    license
    Not graded
    quality
    F
    maintenance
    MCP server for the Upwork GraphQL API enabling job search, contract management, proposal drafting, and other Upwork automation tasks via natural language.
    -
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    An 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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.