Appearance
Tool reference
The Ybug MCP server has twelve tools. Your assistant picks them on its own, so you don't need to call them by name. This page is for when you want to know exactly what it can do, or why it did something.
| Tool | What it does | Plan |
|---|---|---|
list_projects | List your projects | BASIC |
get_project | Get a project's statuses, priorities and types | BASIC |
list_tags | List the team's tags | BASIC |
list_project_members | List who feedback can be assigned to | BASIC |
list_feedback | Find feedback with filters | BASIC |
get_feedback | Read one report in full | BASIC |
get_feedback_console_logs | Read a report's console logs | BASIC |
get_feedback_network_requests | Read a report's network requests | BASIC |
list_comments | Read a report's comments | BASIC |
update_feedback | Change status, priority, type, assignee and tags | STARTUP |
add_comment | Add an internal comment | STARTUP |
create_tag | Create a tag | STARTUP |
On BASIC, the assistant only sees the read tools. If it tries a triage tool anyway, it gets an error that points to the plans.
IDs and names
Projects and reports use their public code as their id, for example hkz92hg6sf. A report's id is the same code you see at the end of its link in the dashboard, so you can paste a report link into the chat.
Wherever a tool takes a status, priority, type or tag, you can pass either its name (matched case-insensitively) or its id from get_project or list_tags. Names are easier to read in a conversation. Ids don't break when someone renames a status.
People are identified by a user id, for example 3f2b9c1e-8d4a-4f6b-9c2e-7a1d5e8f0b3c. It's the id in list_project_members results and in a report's assignee. The assignee filter and update_feedback also take a person's name. When two members share a name, assigning needs the id. Email addresses are never shown.
Read tools
list_projects
Lists the active projects in the connected team that you can access, sorted by name. Returns each project's id and name.
| Argument | Type | Description |
|---|---|---|
query | string | Only projects whose name contains this text. Up to 100 characters |
page | integer | Page number, starting at 1 |
page_size | integer | 1–100, default 25 |
get_project
Returns one project with the values its feedback can use:
statusesin workflow order, each with anid, anameand acategory:backlog,open,in_progress,resolvedorclosed. The category tells the assistant where a custom-named status sits in your workflow.prioritiesandtypes, each with anidand aname
| Argument | Type | Description |
|---|---|---|
project_id | string | Required. The project id from list_projects |
list_tags
Lists the team's tags. Tags are shared across all projects in a team, so this is the whole list, including tags not used on any report yet.
| Argument | Type | Description |
|---|---|---|
query | string | Only tags whose name contains this text. Up to 100 characters |
page | integer | Page number, starting at 1 |
page_size | integer | 1–100, default 25 |
list_project_members
Lists the members of one project that its feedback can be assigned to, sorted by name. Each member has an id, a name and a project role (owner, admin, editor, viewer or guest). Deactivated users and suspended team members aren't listed, because they can't open the project.
| Argument | Type | Description |
|---|---|---|
project_id | string | Required. The project id |
query | string | Only members whose name contains this text. Ignores case and accents. Up to 100 characters |
page | integer | Page number, starting at 1 |
page_size | integer | 1–100, default 25 |
list_feedback
Lists feedback in one project, with filters. Each item has the id, number, title, status, priority, type, assignee, tags, page URL and timestamps. Long descriptions and URLs are shortened; get_feedback returns them in full.
Browser, device and screenshot details aren't in the list. To answer a question like "which reports came from Safari", the assistant opens each report with get_feedback, so narrow the list with filters first.
| Argument | Type | Description |
|---|---|---|
project_id | string | Required. The project id |
statuses | array | Status names or ids |
priorities | array | Priority names or ids. null matches reports with no priority |
types | array | Type names or ids. null matches reports with no type |
tags | array | Tag names or ids. Matches reports with at least one of them |
assignees | array | User ids, assignee names as shown in results, "me", or null for unassigned |
created_after | string | Created at or after this time, with a timezone, e.g. 2026-09-01T00:00:00Z |
created_before | string | Created at or before this time, with a timezone |
query | string | Text in the title or description. Ignores case and accents. Up to 200 characters |
order_by | string | created_at (default) or updated_at |
order | string | asc (oldest first, default) or desc (newest first) |
page | integer | Page number, starting at 1 |
page_size | integer | 1–100, default 25 |
Each filter array takes 1–50 values. Values inside one filter are combined with OR. Different filters are combined with AND. So statuses: ["Open"], assignees: ["me", null] finds open reports that are assigned to you or to nobody.
A response looks like this (shortened):
json
{
"page": 1,
"page_size": 25,
"total_items": 42,
"total_pages": 2,
"items": [
{
"id": "hkz92hg6sf",
"number": 412,
"project_id": "k3m8vq2x1p",
"title": "Coupon code rejected at checkout",
"description": "I typed SPRING10 and it says the code is invalid…",
"status": "Open",
"priority": "High",
"type": "Bug",
"assignee": {
"id": "3f2b9c1e-8d4a-4f6b-9c2e-7a1d5e8f0b3c",
"name": "Jana Nováková"
},
"tags": ["checkout"],
"source_url": "https://acme.example/checkout",
"created_at": "2026-09-15T09:12:44+00:00",
"updated_at": "2026-09-15T09:12:44+00:00"
}
]
}assignee is null when nobody is assigned.
total_pages greater than page means there's more to fetch. The assistant asks for page: 2 next.
get_feedback
Returns one report in full:
- title, full description, status, priority, type, tags and assignee
- the full page URL and where the report came from (widget, extension, etc.)
- a link to the report in Ybug
- browser and version, operating system and version, device type, screen and viewport size
- a screenshot link and a video link, when the report has them
- a
consolesummary: whether a console log was captured, how many errors, warnings and other entries it has, and how many network requests it captured and how many failed (the request total is empty for reports sent before totals were recorded)
Screenshot and video links expire after about an hour. The console counts are a quick index. For the entries themselves, the assistant calls the two tools below.
| Argument | Type | Description |
|---|---|---|
id | string | Required. The report id from list_feedback |
include_media | boolean | Include screenshot and video links. Default true |
get_feedback_console_logs
Lists the browser console entries captured with a report, newest first. Each entry has its level, message, source file and line, how often it repeated, a timestamp and, by default, its stack trace.
| Argument | Type | Description |
|---|---|---|
id | string | Required. The report id |
levels | string[] | Only these levels: error, warn, info, log, debug |
include_stacks | boolean | Include stack traces. Default true |
order | string | desc (newest first, default) or asc |
page | integer | Page number, starting at 1 |
page_size | integer | 1–100, default 25 |
get_feedback_network_requests
Lists the network requests captured with a report, newest first: fetch and XHR calls, and resources that failed to load. Each request has its method, full URL, status, duration, size, a few diagnostic response headers (like content-type and x-request-id) and whether it failed. Request and response bodies are never captured.
Network recording is optional (STARTUP or higher, enabled in the project's widget settings), so an empty list can mean nothing was recorded rather than that nothing failed.
| Argument | Type | Description |
|---|---|---|
id | string | Required. The report id |
errors_only | boolean | Only failed requests: network errors and 4xx/5xx responses. Default false |
statuses | string[] | HTTP statuses, exact ("404") or by class ("5xx") |
methods | string[] | HTTP methods, for example ["POST"] |
url_contains | string | Only URLs containing this text, case-insensitive |
order | string | desc (newest first, default) or asc |
page | integer | Page number, starting at 1 |
page_size | integer | 1–100, default 25 |
list_comments
Lists a report's comments, both internal and public, oldest first. Each comment has its text, whether it's internal, the author's name and timestamps. Author email addresses are never included.
| Argument | Type | Description |
|---|---|---|
id | string | Required. The report id |
order | string | asc (oldest first, default) or desc |
page | integer | Page number, starting at 1 |
page_size | integer | 1–100, default 25 |
Triage tools STARTUP
update_feedback
Changes one report's triage fields. Pass only the fields you want to change. Returns the updated report, without media links.
| Argument | Type | Description |
|---|---|---|
id | string | Required. The report id |
status | string or integer | Status name or id. A report always keeps a status |
priority | string, integer or null | Priority name or id. null clears it |
type | string, integer or null | Type name or id. null clears it |
assignee | string or null | A member id or name from list_project_members, "me", or null to unassign |
add_tags | array | Existing tag names or ids to add, up to 25 |
remove_tags | array | Tag names or ids to remove, up to 25 |
add_tags only uses tags that already exist. To add a new tag, the assistant creates it with create_tag first.
Assigning works like in the dashboard. The new assignee and the previous one get the usual assignment emails, but you never get one about your own change. You can only assign people listed by list_project_members, and "me" only works in projects you're a member of.
Moving a report into a status in the Resolved or Closed category can send your feedback auto-reply to the reporter.
add_comment
Adds an internal comment to one report. Comments added through MCP are never emailed to the reporter and can't be made public.
| Argument | Type | Description |
|---|---|---|
id | string | Required. The report id |
body | string | Required. Comment text, up to 500 characters. HTML is removed |
create_tag
Creates a tag in the connected team. If a tag with the same name already exists (ignoring case and accents), it returns that tag instead of making a duplicate.
| Argument | Type | Description |
|---|---|---|
name | string | Required. Tag name, up to 30 characters. HTML is removed |
A team can have up to 500 tags, and a report up to 25.
Errors
When something goes wrong, the tool returns a short message the assistant can read and act on. The common ones:
| Message | What it means |
|---|---|
Project not found or not accessible. | Wrong id, an archived project, a project in another team, or one you can't access. For security, these all look the same |
Feedback not found or not accessible. | The same for a report id |
Write actions via MCP require the Startup plan or higher | The team is on BASIC. See plans |
This tool requires the "feedback:write" scope. | The assistant was connected without change permission. Disconnect and connect again |
Unknown status "…" (or priority, type) | The name isn't one of the project's values. The assistant should check get_project |
Unknown tag "…" | A list_feedback tag filter got a tag that isn't in the team. The assistant should check list_tags |
Unknown assignee "…" | In a filter: no report in the project is assigned to that name or id. In update_feedback: the value isn't a member id or name from list_project_members, me or null |
Several members are named "…": … | update_feedback got a name that more than one member has. The assistant should use one of the listed ids |
You are not a member of this project, so you cannot be assigned to its feedback. | update_feedback got assignee: "me" from someone who can see the project through their team role but isn't one of its members |
Tag '…' does not exist | add_tags or remove_tags got a tag that isn't in the team. To add a new one, the assistant creates it with create_tag first |
At least one change must be requested. | update_feedback was called with only an id |
Feedback must not contain more than 25 tags | The report already has the maximum number of tags |
Team has reached the maximum number of tags | The team has 500 tags. Remove unused tags in the dashboard |
Creating tags requires permission to edit feedback in at least one project. | Your role doesn't let you edit reports in any project, so you can't create tags either |
Rate limit exceeded: … | Too many calls in a short time for your team. The message says how long to wait |
For connection problems, see Troubleshooting.