{"server":"fastfix-dashboard","version":"1.2.0+861a7d4.ac08538ace8f","session":"ff-ac08538ace8f","endpoint":"https://fastfix.ai/dashboard/mcp","count":24,"tools":[{"name":"list_tasks","title":"List TODO tasks and routines","description":"Lists the TODO page: one-time tasks and ongoing routines (jobs the bot keeps running), grouped by list, with ids, status, notes, comments and attached proof. added_by is \"user\" for tasks the owner typed himself (his own) and \"bot\" for tasks bots collected (from email, meetings, other bots); area is work or personal. Items with assignee \"bot\" were handed to you by the owner (the dashboard hand-off button; status \"waiting\" until you start, then \"working\"). Use delegated=true to get your queue: those items plus any task where the owner commented after your last reply (needs_reply). Do each one, then finish with attach_proof + complete_task, or add_task_comment if you need the owner.","inputSchema":{"type":"object","properties":{"include_done":{"type":"boolean","description":"Include finished items (default false)"},"assignee":{"type":"string","enum":["bot","owner"],"description":"Only items handed to the bot, or only the owner's own"},"delegated":{"type":"boolean","description":"true = your queue: open tasks handed to you plus tasks with an owner comment waiting for your reply"}}},"annotations":{"title":"List TODO tasks and routines","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"add_task","title":"Add a TODO task or routine","description":"Adds a one-time task, or an ongoing routine (routine=true) that shows as \"Working\" on the TODO page. It appears at the top of the list on the dashboard right away. Include where it came from (source, source_url) and why it exists (why): the card shows them under the title.","inputSchema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","description":"Short title, e.g. \"Namecheap: renew fastfix.ai\""},"routine":{"type":"boolean","description":"true = ongoing routine the bot keeps doing; false = one-time task (default)"},"list":{"type":"string","description":"List name or id (default: the first list). A new list is created if the name does not exist."},"note":{"type":"string","description":"Details / notes for the bot"},"due":{"type":"string","description":"Short due label shown on the card, e.g. \"Today\", \"Fri\", \"Expiring\""},"urgent":{"type":"boolean","description":"Highlight as urgent"},"needs_you":{"type":"boolean","description":"Routines only: the owner must do something (shows \"Your turn\")"},"parent_routine_id":{"type":"string","description":"Optional: the routine this task blocks or belongs to"},"source":{"type":"string","description":"Where the task came from, shown under its title: which email (\"Email from Maria Lopez <maria@acme.com>\"), meeting (\"Meeting: Site visit, 12 Oak St\"), call, text, or \"Assistant\". \"\" clears it."},"source_type":{"type":"string","enum":["email","meeting","call","text","bot","web","owner","other"],"description":"Icon for the source. Guessed from source / source_url when left out."},"source_url":{"type":"string","description":"Optional https link to the source (the email thread, meeting, document). \"\" clears it."},"why":{"type":"string","description":"Why the task exists, one short line, e.g. \"She needs the quote before Friday to book the crew\""},"area":{"type":"string","enum":["work","personal",""],"description":"Work or personal (\"\" clears it)"},"media_url":{"type":"string","description":"Optional https link to the video or picture this is about (YouTube, Vimeo, Google Drive, a direct image/video link, or a Supabase public URL). Dashboard tools show a small thumbnail from the link and play it from the source; no file is uploaded or stored. \"\" clears it."},"audio_url":{"type":"string","description":"Optional https link to an audio recording this is about (a call recording such as Bland's recording_url, a voicemail or voice note). Dashboard tools show an inline play button that streams from the source; nothing is stored. \"\" clears it."},"domain":{"type":"string","description":"Optional company website domain, e.g. \"safeway.com\": dashboard tools show its logo. \"\" clears it."}}},"annotations":{"title":"Add a TODO task or routine","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"update_task","title":"Update a task or routine","description":"Changes a task or routine: title, note, due label, urgency, list, where it came from (source, source_url) and why, routine stage (asked → working → proof → done) or whether the owner needs to act.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Task id from list_tasks"},"title":{"type":"string","description":"New title"},"note":{"type":"string","description":"Replace the note"},"due":{"type":"string","description":"Short due label (\"\" to clear)"},"urgent":{"type":"boolean"},"list":{"type":"string","description":"Move to this list (name or id)"},"routine":{"type":"boolean","description":"Turn a one-time task into a routine (true) or back (false)"},"stage":{"type":"string","enum":["asked","working","proof","done"],"description":"Routine stage"},"needs_you":{"type":"boolean","description":"Routine needs the owner (\"Your turn\")"},"done":{"type":"boolean","description":"Mark done / not done"},"assignee":{"type":"string","enum":["bot","owner"],"description":"\"owner\" hands a task back to the owner (better: add_task_comment, which says why); \"bot\" takes it on"},"source":{"type":"string","description":"Where the task came from, shown under its title: which email (\"Email from Maria Lopez <maria@acme.com>\"), meeting (\"Meeting: Site visit, 12 Oak St\"), call, text, or \"Assistant\". \"\" clears it."},"source_type":{"type":"string","enum":["email","meeting","call","text","bot","web","owner","other"],"description":"Icon for the source. Guessed from source / source_url when left out."},"source_url":{"type":"string","description":"Optional https link to the source (the email thread, meeting, document). \"\" clears it."},"why":{"type":"string","description":"Why the task exists, one short line, e.g. \"She needs the quote before Friday to book the crew\""},"area":{"type":"string","enum":["work","personal",""],"description":"Work or personal (\"\" clears it)"},"media_url":{"type":"string","description":"Optional https link to the video or picture this is about (YouTube, Vimeo, Google Drive, a direct image/video link, or a Supabase public URL). Dashboard tools show a small thumbnail from the link and play it from the source; no file is uploaded or stored. \"\" clears it."},"audio_url":{"type":"string","description":"Optional https link to an audio recording this is about (a call recording such as Bland's recording_url, a voicemail or voice note). Dashboard tools show an inline play button that streams from the source; nothing is stored. \"\" clears it."},"domain":{"type":"string","description":"Optional company website domain, e.g. \"safeway.com\": dashboard tools show its logo. \"\" clears it."}}},"annotations":{"title":"Update a task or routine","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"complete_task","title":"Complete a task or routine","description":"Marks a one-time task done, or finishes a routine (shows \"Proof ✓\"). Records what was done and a proof screenshot URL. Tasks the owner handed to you (assignee \"bot\") need proof: pass proof_url, or attach_proof first; the owner reviews it on the dashboard.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Task id"},"summary":{"type":"string","description":"One line: what was done"},"proof_url":{"type":"string","description":"https URL of a screenshot proving it"}}},"annotations":{"title":"Complete a task or routine","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"report_routine_run","title":"Report a routine run","description":"Logs one run of an ongoing routine (what the bot did and the result). status \"stuck\" flags it as needing the owner (\"Your turn\").","inputSchema":{"type":"object","required":["id","did","result"],"properties":{"id":{"type":"string","description":"Routine id"},"did":{"type":"string","description":"What the bot did, e.g. \"Screened 9 applicants\""},"result":{"type":"string","description":"Result, e.g. \"1 worth a call\""},"status":{"type":"string","enum":["ok","stuck"],"description":"Default ok"},"proof_url":{"type":"string","description":"Optional https screenshot URL"}}},"annotations":{"title":"Report a routine run","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"attach_proof","title":"Attach a proof screenshot","description":"Attaches a proof screenshot (https image URL) to a task or routine. It shows in the task's proof strip on the dashboard as the picture with the caption as its one-line title; when the owner opens it, the caption is the one line shown above the image (the task title if there is none), and they answer \"Is this right?\". A \"No, fix it\" comes back as an owner comment (needs_reply in list_tasks). Returns proof_id for update_proof / delete_proof.","inputSchema":{"type":"object","required":["task_id","url"],"properties":{"task_id":{"type":"string","description":"Task id"},"url":{"type":"string","description":"https URL of the screenshot image"},"caption":{"type":"string","description":"Optional one plain line saying what the screenshot shows, e.g. \"Synced 17 subscriptions + 3 invoices; $608.35/mo active\""}}},"annotations":{"title":"Attach a proof screenshot","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"update_proof","title":"Edit a proof","description":"Changes the caption (the one line shown under the picture and above it in the viewer) and/or the screenshot of a proof. A new screenshot asks the owner \"Is this right?\" again.","inputSchema":{"type":"object","required":["proof_id"],"properties":{"proof_id":{"type":"string","description":"Proof id from attach_proof or list_tasks (proofs[].id)"},"caption":{"type":"string","description":"New one-line caption; \"\" clears it"},"url":{"type":"string","description":"New https URL of the screenshot"}}},"annotations":{"title":"Edit a proof","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"delete_proof","title":"Delete a proof","description":"Removes a proof screenshot from its task (for a wrong or duplicate screenshot).","inputSchema":{"type":"object","required":["proof_id"],"properties":{"proof_id":{"type":"string","description":"Proof id from attach_proof or list_tasks (proofs[].id)"}}},"annotations":{"title":"Delete a proof","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"add_task_comment","title":"Comment on a task","description":"Writes a comment on a task; the owner sees it under the task (More info). Use it when you need the owner for a task they handed you (a decision, a login, a card, something only a person can do): by default this hands the task back to them with your comment shown under the title. Set needs_you=false for a progress note or a reply that keeps the task with you.","inputSchema":{"type":"object","required":["task_id","body"],"properties":{"task_id":{"type":"string","description":"Task id from list_tasks"},"body":{"type":"string","description":"The comment, plain and short, e.g. \"AT&T wants a mailed check for this bill. Can you mail $122.57 to the address on the bill?\""},"needs_you":{"type":"boolean","description":"true (default) = the owner has to act: the task goes back to them with this note. false = just a note; the task stays with you."}}},"annotations":{"title":"Comment on a task","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"list_task_comments","title":"Read the comments on a task","description":"All comments on a task, oldest first: author \"user\" (the owner) or \"bot\" (you).","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string","description":"Task id"}}},"annotations":{"title":"Read the comments on a task","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"list_events","title":"List schedule events","description":"Lists Schedule events between two times (default: this week, Monday to Sunday), with place, online / in person, and the \"What's going to happen\" bullets. Times are ISO 8601; times without an offset are in the owner's time zone (returned as \"timezone\", default America/Los_Angeles).","inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"Start (ISO 8601)"},"to":{"type":"string","description":"End (ISO 8601)"}}},"annotations":{"title":"List schedule events","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"add_event","title":"Add a schedule event","description":"Adds an event to the Schedule page. The dashboard shows the current week, so events this week appear immediately. Times are ISO 8601; without an offset they are in the owner's time zone (default America/Los_Angeles). Give a location for in-person events (the dashboard shows a pin, a drive card and a Google Maps button) or a meeting_url for online ones (camera icon).","inputSchema":{"type":"object","required":["title","start"],"properties":{"title":{"type":"string","description":"Event title, e.g. \"Site visit: 12 Oak St\""},"start":{"type":"string","description":"Start, e.g. 2026-10-16T09:30 or 2026-10-16T16:30:00Z"},"end":{"type":"string","description":"End (ISO 8601). Defaults to start + minutes"},"minutes":{"type":"number","description":"Length in minutes when end is not given (default 60)"},"kind":{"type":"string","enum":["meeting","drive","hold"],"description":"meeting (default), drive, or hold"},"location":{"type":"string","description":"Where: a street address or place for in-person events (e.g. \"12 Oak St, Berkeley, CA\"), or \"Zoom\" / \"Online\""},"meeting_url":{"type":"string","description":"Video call link (https). Makes the event online."},"online":{"type":"boolean","description":"The In person / Online pill on the event: true = online (shows the meeting link), false = in person (shows the place). It overrides the guess; default: online if there is a meeting_url or the location says Zoom/Meet/online."},"whats_going_to_happen":{"type":"array","items":{"type":"string"},"maxItems":8,"description":"Short bullet points shown under \"What's going to happen\" (each under ~10 words)"},"ideas":{"type":"string","description":"The owner's raw ideas for the meeting. When whats_going_to_happen is not given, they are organized into bullets for you."},"notes":{"type":"string","description":"Optional private notes"},"description":{"type":"string","description":"What this is, in one short sentence"},"with":{"type":"string","description":"Who it is with, e.g. \"Maria (Oak St)\". Shown next to the time."},"bring":{"type":"array","items":{"type":"string"},"maxItems":3,"description":"Up to 3 short things to bring or decide"}}},"annotations":{"title":"Add a schedule event","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"update_event","title":"Update a schedule event","description":"Changes an event: title, time, place, online / in person, or the \"What's going to happen\" bullets (set them directly, or pass the owner's ideas to have them organized). Times without an offset are in the owner's time zone (default America/Los_Angeles). Pass \"\" to clear a text field.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Event id from list_events"},"title":{"type":"string","description":"New title"},"start":{"type":"string","description":"New start (ISO 8601). Keeps the same length unless end/minutes is given."},"end":{"type":"string","description":"New end (ISO 8601)"},"minutes":{"type":"number","description":"New length in minutes"},"kind":{"type":"string","enum":["meeting","drive","hold"]},"location":{"type":"string","description":"Street address / place, or \"Zoom\" / \"Online\""},"meeting_url":{"type":"string","description":"Video call link (https)"},"online":{"type":["boolean","null"],"description":"The In person / Online pill: true = online, false = in person (overrides the guess), null = infer from location / meeting_url again"},"whats_going_to_happen":{"type":"array","items":{"type":"string"},"maxItems":8,"description":"Replace the bullet points ([] clears them)"},"ideas":{"type":"string","description":"Replace the owner's ideas; organized into bullets unless whats_going_to_happen is also given"},"notes":{"type":"string","description":"Replace the private notes"},"with":{"type":"string","description":"Who it is with"}}},"annotations":{"title":"Update a schedule event","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"list_subscriptions","title":"List subscriptions and invoices","description":"Lists the Subscriptions page: tool renewals (monthly price, on/off) and invoices to approve (open/late/paid). Subscriptions the owner tapped \"Cancel\" on have cancel_requested and a cancel_stage (requested → canceling → canceled → refund_asked → refunded). cancel_requested=true lists only the cancellations you still have to work on (requested, canceling, refund_asked).","inputSchema":{"type":"object","properties":{"cancel_requested":{"type":"boolean","description":"true = only subscriptions with a cancellation in progress"}}},"annotations":{"title":"List subscriptions and invoices","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"upsert_subscription","title":"Add or update a subscription or invoice","description":"Adds or updates a subscription (monthly tool cost) or an invoice. Matches an existing one by id, or by kind + name (case-insensitive).","inputSchema":{"type":"object","required":["name"],"properties":{"id":{"type":"string","description":"Existing id (optional)"},"name":{"type":"string","description":"Service or vendor name, e.g. \"Slack Pro\""},"kind":{"type":"string","enum":["subscription","invoice"],"description":"Default subscription"},"amount":{"type":"number","description":"Monthly price (subscription) or invoice total, in USD"},"status":{"type":"string","enum":["on","off","open","late","paid"],"description":"subscription: on/off; invoice: open/late/paid"},"note":{"type":"string","description":"Short line under the name, e.g. \"Renews Oct 22\", \"Due Fri\", \"Trial · 4 days left\""},"renews_soon":{"type":"boolean","description":"Subscriptions: highlight as renewing soon"},"unused":{"type":"boolean","description":"Subscriptions: highlight as unused"},"domain":{"type":"string","description":"Company website domain for the logo on the row, e.g. \"slack.com\" (\"\" clears it)"},"logo_url":{"type":"string","description":"Optional https URL of the company logo; overrides the domain favicon (\"\" clears it)"}}},"annotations":{"title":"Add or update a subscription or invoice","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"update_subscription_status","title":"Move a subscription cancellation along","description":"Updates the cancellation of a subscription the owner asked you to cancel; the row shows the stage as a pill. Stages: canceling (you started), canceled (done: the subscription is turned off and counted as saved), refund_asked (you asked for a refund), refunded. Add a short note the owner sees on the row and, when you have it, a proof_url screenshot (cancellation confirmation, refund email).","inputSchema":{"type":"object","required":["id","stage"],"properties":{"id":{"type":"string","description":"Subscription id or name from list_subscriptions"},"stage":{"type":"string","enum":["requested","canceling","canceled","refund_asked","refunded"]},"note":{"type":"string","description":"One short line shown under the name, e.g. \"Canceled; access ends Oct 31\" or \"Asked for a $59.99 refund\""},"proof_url":{"type":"string","description":"Optional https screenshot URL proving this step"}}},"annotations":{"title":"Move a subscription cancellation along","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"list_connectors","title":"List connector skills","description":"Lists the Connectors page: each tool (WhatsApp, Gmail, Instagram, YouTube, …), what the bot does with it in plain words, whether it is installed in the bot army, whether FastFix has verified it (only verified tools can be added from the Connectors page; the rest show as Coming soon), and its skills with step-by-step instructions.","inputSchema":{"type":"object","properties":{"category":{"type":"string","enum":["messages","social media","money","jobs & hiring"]},"installed_only":{"type":"boolean"}}},"annotations":{"title":"List connector skills","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"install_connector","title":"Install a connector or skill","description":"Adds a connector to the bot army (shows as \"In your army\" on the Connectors page) and optionally installs one of its skills. Returns the setup steps and the skill instructions. Install a connector once it works for this owner. Set installed=false to remove it.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Connector id or name, e.g. \"whatsapp\", \"Instagram\""},"skill":{"type":"string","description":"Optional skill name to install, e.g. \"Answer DMs\""},"installed":{"type":"boolean","description":"Default true"}}},"annotations":{"title":"Install a connector or skill","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"request_tool","title":"Build a private dashboard tool","description":"Builds a small private dashboard tool for this account: a view over data the owner's FastFix bots already have (schedule, tasks, subscriptions, invoices, domains, proofs, routines). Saved templates are used first, at no model cost. Pictures, videos, audio and logos are links, never files: pass media_urls (YouTube, Vimeo, Google Drive, direct image/video or Supabase public links), audio_urls (call recordings such as Bland recording_url links) and websites (company domains such as \"safeway.com\"); the kit shows small lazy thumbnails that play from the source, inline audio players and favicon logos, with the plain gradient / letter tile when a link fails. Returns a clickable HTML preview (preview_file + preview_html, also attached as an HTML resource) to show the owner before anything ships, or a refusal with an alternative. Previews always use the fixed FastFix kit; this tool is the supported way to create or mock up a dashboard tool, and its preview is meant to be shared unchanged. Limit: 3 new tools per day per account.","inputSchema":{"type":"object","properties":{"prompt":{"type":"string","description":"What the tool should show, in the owner's words"},"screenshot_url":{"type":"string","description":"Optional https link to a screenshot or sketch"},"media_urls":{"type":"array","items":{"type":"string"},"maxItems":12,"description":"Optional https links to the videos or pictures the tool shows (YouTube, Vimeo, Google Drive, direct image/video, Supabase public URL). Shown as ~30 KB thumbnails; nothing is stored."},"audio_urls":{"type":"array","items":{"type":"string"},"maxItems":12,"description":"Optional https audio links, e.g. call recordings (Bland recording_url), voicemails. Shown as inline players that stream from the source; nothing is stored."},"websites":{"type":"array","items":{"type":"string"},"maxItems":12,"description":"Optional company website domains for logos, e.g. [\"safeway.com\",\"walmart.com\"]."}},"required":["prompt"]},"annotations":{"title":"Build a private dashboard tool","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"edit_tool","title":"Edit a dashboard tool preview","description":"Changes one part of a tool from request_tool and returns a new preview. Only the targeted section is rewritten; the layout stays the same. Limit: 5 edits per day per account.","inputSchema":{"type":"object","properties":{"tool_id":{"type":"string","description":"id from request_tool or list_my_tools"},"change":{"type":"string","description":"What to change"}},"required":["tool_id","change"]},"annotations":{"title":"Edit a dashboard tool preview","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"approve_tool","title":"Ship a dashboard tool","description":"Ships a previewed tool to this account only. Use it after the owner has seen the preview and confirmed.","inputSchema":{"type":"object","properties":{"tool_id":{"type":"string","description":"id of the tool"}},"required":["tool_id"]},"annotations":{"title":"Ship a dashboard tool","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"rate_tool","title":"Rate a dashboard tool","description":"Records the owner's thumbs up or down on one of their tools. Only the layout's shape (no words, numbers or account details) is counted, anonymously, toward the shared FastFix templates.","inputSchema":{"type":"object","properties":{"tool_id":{"type":"string","description":"id of the tool"},"rating":{"type":"string","enum":["up","down"],"description":"up or down"}},"required":["tool_id","rating"]},"annotations":{"title":"Rate a dashboard tool","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"list_my_tools","title":"List my dashboard tools","description":"Lists the DIY tools on this account and their status.","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"List my dashboard tools","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"update_tool_data","title":"Save real data to my dashboard tool","description":"Saves the latest real data from your work into your own dashboard tool, once a day. No model call and no edit limit: you send the data, the dashboard draws it in the fixed FastFix design. data is the same JSON spec request_tool tools use: {\"hero\":{\"eyebrow\",\"big\",\"sub\",\"tone\",\"boxes\"},\"tabs\":[{\"label\",\"cards\":[{\"title\",\"lines\",\"status\":{\"text\",\"tone\"},\"right\",\"rightSub\",\"detail\",\"link\":{\"href\",\"text\"},\"media\",\"audio\",\"domain\"}]} or \"table\":{...}],\"note\"}. Real data only: no \"Example\" tag and no sample rows; when you have nothing real yet, leave the tool alone and it shows \"No data yet\". Pictures, videos, recordings and proof are https links, not files. Up to 64 KB; one save per tool per hour (a daily refresh is the expected use). Replaces the tool's previous data.","inputSchema":{"type":"object","properties":{"tool_id":{"type":"string","description":"Your tool id on the dashboard (for example \"creditscore\", \"bland\", or a request_tool id)"},"data":{"type":"object","description":"The kit spec with your real numbers, rows, links, media and proof URLs."},"source":{"type":"string","description":"Your bot name, shown as \"saved by\" under the tool"}},"required":["tool_id","data"]},"annotations":{"title":"Save real data to my dashboard tool","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}]}