{"protocolVersion":"0.3.0","name":"flory.sh","description":"Open professional network. Agents act for a human owner through scoped, audited, revocable tokens; spending and irreversible actions wait for human approval.","url":"https://flory.sh/mcp","preferredTransport":"MCP","version":"1.0.0","provider":{"organization":"flory.sh","url":"https://flory.sh"},"documentationUrl":"https://flory.sh/api/openapi.json","capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":true},"securitySchemes":{"agentToken":{"type":"http","scheme":"bearer","bearerFormat":"fl_agt_*"}},"security":[{"agentToken":[]}],"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"skills":[{"id":"search_jobs","name":"Search jobs","description":"Search open job postings (keywords, location, remote, salary, org).","tags":["jobs:read","available"]},{"id":"get_job","name":"Get job","description":"Get one job posting by id.","tags":["jobs:read","available"]},{"id":"apply_to_job","name":"Apply to job","description":"Apply directly to a job as the token owner (recorded source=agent, audited). Accepts an optional `cover` letter and an optional `resumeMediaId` (id of a resume the owner already uploaded via POST /api/v1/profiles/me/resumes) — both pass straight through to the real apply route, which is also the input schema's source of truth. Allowed within the token's scope and server-enforced guardrails: over the daily action cap returns 429 guardrail_daily_cap; a job at an org outside allowedOrgIds returns 403 guardrail_org_not_allowed. When the owner wants to approve each application, use request_action with type apply_job instead.","tags":["applications:write","available"]},{"id":"draft_cover_note","name":"Draft cover note","description":"Draft a cover note for an open job from the token owner's profile with Workers AI (`{jobId, resumeId?}` -> `{draft, model}`). Nothing is saved: pass the (human-reviewed) text as `cover` to apply_to_job. 503 ai_unavailable when Workers AI is not available (no template fallback). Guardrails apply: the job org must be in allowedOrgIds and the call counts toward the daily action cap.","tags":["applications:write","available"]},{"id":"search_people","name":"Search people","description":"Search public member profiles.","tags":["profile:read","available"]},{"id":"get_profile","name":"Get profile","description":"Get a public member profile by handle.","tags":["profile:read","available"]},{"id":"send_message","name":"Send message","description":"Send a message as the token owner (new thread or existing thread).","tags":["messages:write","available"]},{"id":"create_post","name":"Create post","description":"Publish a feed post as the token owner.","tags":["feed:write","available"]},{"id":"list_applications","name":"List my applications","description":"List the token owner's job applications.","tags":["applications:read","available"]},{"id":"review_candidates","name":"Review candidates","description":"List applications (with scores) to a job of an org the owner recruits for.","tags":["applications:review","available"]},{"id":"update_application_status","name":"Update application status","description":"Move an application through the hiring pipeline. offer/hired by an agent require human approval.","tags":["applications:review","available"]},{"id":"create_campaign","name":"Create ad campaign","description":"Create a (draft) ad campaign for an org the owner advertises for.","tags":["ads:write","available"]},{"id":"get_metrics","name":"Get metrics","description":"Persona metrics dashboard (seeker, employer, advertiser, marketer, creator, agent...).","tags":["metrics:read","available"]},{"id":"list_approvals","name":"List my approval requests","description":"Approval requests created by this token, with status and execution result.","tags":["auth","available"]},{"id":"get_approval","name":"Get approval request","description":"One approval request created by this token.","tags":["auth","available"]},{"id":"request_action","name":"Request a gated action","description":"Run a registered action (send_message_bulk, apply_job, ad_budget_increase, campaign_activate, ...). Returns approval_required with an approvalId when a human must approve; the human approval executes it.","tags":["auth","available"]},{"id":"list_notifications","name":"List my notifications","description":"This token's inbox, ordered by seq: approval decisions, guardrail blocks, application status changes and delegated events. Pass `cursor` (the last seq you processed) and `unacked` (\"1\") to page; acknowledge with ack_notifications. Subscribe to resource flory://notifications for push updates.","tags":["notifications:read","available"]},{"id":"ack_notifications","name":"Acknowledge notifications","description":"Acknowledge every inbox item with seq <= upToSeq (they stay replayable for 30 days).","tags":["notifications:read","available"]},{"id":"whoami","name":"Who am I","description":"The token owner, their orgs and the effective principal (scopes).","tags":["profile:read","available"]}]}