FOWL AI Tools · Developers
One standard. Any assistant.
Every FOWL AI tool is a remote MCP server over streamable HTTP. Each tool lives at its own path on tools.fowl-ai.com, carries its own instructions, and uses the same sign-in.
Connecting
One FOWL AI Tools account works for every tool. Clients that support MCP sign-in use it; others use a personal key.
Sign in (recommended)
Standard MCP authorization: OAuth 2.1 with PKCE and dynamic client registration. The user signs in with an emailed code. Tokens last 30 days and refresh.
Endpoint plus key
For clients that can send headers.
Private link
For clients that only take a URL. Treat it like a password.
Keys are made on the account page and are stored only as a hash. Name each key, and revoke any one without affecting the others. Tool results that point to files (tailored resumes, screenshots, the tracker) return private download links.
Client setup
| Client | How |
|---|---|
| Claude (claude.ai, Desktop, mobile) | Settings → Connectors → Add custom connector. Paste https://tools.fowl-ai.com/job-agent/mcp, press Connect, sign in. |
| Claude Code | claude mcp add --transport http job-agent https://tools.fowl-ai.com/job-agent/mcp then /mcp to sign in. |
| ChatGPT | Settings → Apps & Connectors → Advanced → Developer mode → Create. Paste https://tools.fowl-ai.com/job-agent/mcp, authentication OAuth. |
| Grok | Add a remote MCP server: https://tools.fowl-ai.com/job-agent/mcp with header Authorization: Bearer <key>, or the private link. |
| Meta Muse | Add an MCP connector: https://tools.fowl-ai.com/job-agent/mcp with the key as API key, or the private link. |
| Anything else | Any client that speaks MCP over streamable HTTP. Use the private link, or the endpoint plus a Bearer header. |
Menu names change often. Look for connectors, MCP, tools or integrations.
Job Agent: tool reference
22 tools. The whole flow is one loop: start_here once, then next_task until it returns done. Each task carries its own instructions and data (resume text, the posting, the questions to ask), so any assistant can follow it. The other tools are what the tasks tell it to call. Parameters marked ? are optional.
| Tool | Parameters | What it does |
|---|---|---|
start_here | none | Call this first in every conversation. Returns how to run the user's job search and the first task to do. After that, keep calling next_task. |
next_task | none | The job search, one step at a time. Returns ONE task: what to do, why, and the data you need (resume text, job posting, questions...). Do it, then call next_task again, until it returns task "done". This is the main loop; you don't need to plan the steps yourself. |
save_answers | url, answers | Save answers you wrote for one job's open questions ({question: answer}). They're used when the form is filled. |
setup_from_resume | resume_text?, file_base64?, filename?, resume_path? | Step 1. Save the user's resume. Give ONE of: resume_text: the full resume as text (paste it, or the text of a file they uploaded); file_base64 + filename: an uploaded PDF or .docx file, base64-encoded; resume_path: a file path (only when this server runs on the user's own computer). Returns the resume text. Then pull out name, email, phone, city, LinkedIn, current company and title, every past employer, degree and school, and save them with save_profile. |
get_setup_questions | none | Step 2. The one-time questions, grouped. Ask only what the resume didn't answer, a few at a time, and save answers with save_profile using these keys. |
save_profile | updates | Save profile answers as an object of key -> value (or the same as a JSON string). Partial updates are merged; nested groups (consent, writing, eeo) merge too. Example: {"titles": ["Product Manager"], "work_modes": ["Remote"], "consent": {"arbitration": "ask"}} |
get_profile | none | The saved profile (without the full resume text). |
teach_answer | question, answer | Save the user's answer to a question the setup didn't cover. Used on every future form. |
find_jobs | titles?, companies?, limit? | Search for openings now (Greenhouse, Lever and Ashby boards) that fit the profile. Optional titles or companies narrow it. Use when the user asks to browse; next_task already searches on its own. |
match_job | url | Step 5. Read one posting: description, every application question, and which ones the profile answers. Returns the base resume and the rules for tailoring it to this job. |
save_tailored_resume | url, resume_markdown, match_score, industry, cover_letter?, written_answers? | Step 6. Save the resume tailored for this job as Markdown and PDF in a new folder named with today's date and time, plus the cover letter and written answers (question label -> text). Records the match score and industry in the tracker. |
fill_application | url, practice? | Step 7. Fill the application and return a screenshot. Never submits. practice=true fills a local copy of this exact form (same questions), safe for demos. practice=false fills the real form with all outgoing data blocked. |
send_for_approval | url | Telegram mode. Send this job to the user's Telegram with Apply / Skip buttons. |
submit_application | url, user_approved | Submit for real. Only call when the user approved this exact job, or mode is autonomous. Refuses if any required question is unanswered or the daily cap is reached. |
telegram_setup | none | Step 3. The exact steps to connect Telegram. Show them to the user as written. |
connect_telegram | token | Telegram step 7: save the BotFather token and get the link the user taps to finish. |
finish_telegram | none | Telegram step 9: confirm the user pressed Start and send a test message. |
update_stage | url, stage, notes? | Move a job to a new stage after applying: heard_back, interviewing, offer, rejected (or skipped). Notes are optional (recruiter name, interview date). |
check_email_for_updates | none | Optional. If the user has a Gmail connector, use it with these searches to find replies from companies they applied to, then call update_stage for each one you find. Read the email before deciding: interview invite -> interviewing, rejection -> rejected, other reply -> heard_back. |
tracker | status? | Step 9. Every job: date, company, role, industry, match score, stage, follow-up date and resume folder. Saved as a spreadsheet (tracker.csv) and a color-coded page (tracker.html). |
schedule_daily | at?, timezone? | Every day at this time (24-hour, e.g. "07:30", in the user's timezone such as "America/New_York"), line up new jobs and nudge the user on Telegram to open their assistant. Apply / Skip taps on Telegram are handled within 2 minutes. |
stop_daily | none | Turn off the daily run and the Telegram tap checking. |
Behavior you can rely on
The assistant is the brain
No model runs on the server and no API keys are needed. The connected assistant reads, asks and writes; the server stores, searches, fills, tracks and messages Telegram.
Safe previews
fill_application never submits. Practice runs use a local copy of the exact form; previews block every outgoing request.
Explicit approval
submit_application refuses without user_approved unless the user chose autonomous mode, and stops at the daily cap.
Plain errors
Errors come back as tool results with a plain reason the assistant can relay, like a missing key or an unanswered question.
Want to build on FOWL AI tools or suggest one? Get in touch.