FoundersOS
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SUPABASE_URL | Yes | Supabase project URL (required) | |
| EMBEDDING_DIM | No | Embedding dimension (must match database schema dimension) | |
| OPENAI_API_KEY | No | OpenAI API key (required if EMBEDDING_PROVIDER=openai) | |
| EMBEDDING_MODEL | No | Embedding model, uses provider default if omitted | |
| OLLAMA_BASE_URL | No | Ollama server URL (required if EMBEDDING_PROVIDER=ollama) | |
| AWS_ACCESS_KEY_ID | No | AWS access key ID for Bedrock (optional, uses default AWS credential chain if omitted) | |
| AWS_DEFAULT_REGION | No | AWS region for Bedrock (optional, used if EMBEDDING_PROVIDER=bedrock) | |
| EMBEDDING_PROVIDER | No | Embedding provider: openai, bedrock, ollama. Defaults to 'openai' | |
| FOUNDERS_OS_USER_ID | No | User identifier for personal scopes, defaults to 'default' | |
| SUPABASE_SECRET_KEY | Yes | Supabase secret key (required) | |
| FOUNDERS_OS_TIMEZONE | No | Timezone used by date-aware tools, e.g. 'America/Los_Angeles' | |
| AWS_SECRET_ACCESS_KEY | No | AWS secret access key for Bedrock (optional) | |
| FOUNDERS_OS_COMPANY_ID | No | Company identifier for scoping data, defaults to 'default' |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pingB | Test tool — returns pong. Update available: running v0.14.0, latest v1.4.0. Restart with @latest to update. |
| get_versionA | Returns the running version of @ourthinktank/founders-os, the rendering contract version (used to detect plugin/server drift), how the connector was launched (launchMethod: npx | global | local | unknown) with a tailored howToUpdate string, the release channel (channel: stable | prerelease), the published head of that channel, and the database schema status (dbSchemaStatus: current | behind | ahead | untracked | unknown) with a howToUpdateDb step when action is needed. Version comparison is semver-aware and channel-aware: stable builds compare against the |
| get_usage_guideA | Returns a detailed guide on how to use Founders OS - covering all six domains (CRM, Tasks, Tags, Finance, Feeds, Memory), surface tools, search protocols, common workflows, and tips. Call this when uncertain about how to approach a task. |
| show_capabilitiesA | Returns example prompts and workflows organized by domain (CRM, Tasks, Finance, Feeds, Memory, Surfaces). Call this when a user asks 'what can you do?', 'show me what I can do', 'help me get started', or wants to explore what Founders OS offers. Lighter than the full usage guide - focused on natural-language examples rather than technical reference. |
| list_demosA | Returns available interactive demo walkthroughs bundled with Founders OS. When called without a name, returns a summary list of available demos. When called with a demo name, returns the full script (with shared presentation rules prepended) so the AI agent can run it directly. Call this when a user asks about demos, wants to explore features, or is onboarding. |
| add_customerA | Create a new customer record. Customers are organizations or individuals that your business works with or is pursuing. If similar customers already exist, a |
| get_customerA | Get a single customer with their contacts, recent interactions, and open tasks. |
| update_customerC | Update fields on an existing customer record. |
| search_customersA | Search customers by name, notes, city, state, or tags. Returns matching customers with summary info. |
| list_customersA | List customers with optional filters. Returns paginated results with summary info. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| remove_customerA | Remove a customer by archiving (sets phase to inactive, recoverable) or permanently deleting. On first call, returns a |
| add_contactB | Add a contact person to a customer organization. Contacts are individuals you interact with at that company. |
| update_contactC | Update a contact's details. |
| search_contactsA | Search for contacts by name, email, phone, or role. Returns matching contacts with their customer/organization info. Use this when someone asks about a person by name. |
| remove_contactA | Remove a contact by archiving (marks as inactive, recoverable) or permanently deleting. On first call, returns a |
| log_interactionA | Record an interaction with a customer (email, call, meeting, demo, support ticket, event, or general note). |
| list_interactionsB | Get interaction history for a customer, with optional date range and type filter. |
| remove_interactionA | Soft-delete a logged interaction (email, call, meeting, etc.) by its UUID. Interactions are append-only touchpoint history, so there is no archive state - removal is a soft-delete, recoverable for 30 days, then purged. On first call returns a |
| get_dashboardA | Get a CRM dashboard summary: total customers by type and phase, overdue tasks, recent interactions, and upcoming tasks within a 7/14/30-day window. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| create_taskA | Create a new task. Scope 'org' (default) is visible to all team members; 'personal' is private to the creator. Use assigned_to with a FOUNDERS_OS_USER_ID for human assignment, or '@claude' / '@gpt' for AI assignment. Optionally link to any FounderOS entity (customer, contact, transaction, etc.) at creation time. If the response contains a |
| get_taskA | Fetch a single task by ID, including all linked entities and notes. |
| update_taskA | Update any fields on a task. Only provided fields are changed. Setting status to 'done' automatically sets completed_at. If the response contains a |
| complete_taskA | Mark a task as done. Optionally log a completion note. Set store_as_memory=true to persist the completion as an org-scoped memory. Returns unblocked_tasks if completing this task unblocks dependent tasks. If the task is blocked by an incomplete task, a |
| remove_taskB | Remove a task by archiving (hides from active views, recoverable) or permanently deleting. On first call, returns a |
| list_tasksA | List tasks with rich filtering. Omitting scope returns both org tasks and the caller's personal tasks. Filter by entity_type + entity_id to see tasks linked to a specific customer, transaction, etc. Use assigned_to='@claude' to surface the AI work queue. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| link_taskA | Link a task to any FounderOS entity: customer, contact, transaction, contract, memory, or interaction. A task can have multiple links. Duplicate links are silently ignored. |
| unlink_taskA | Remove a specific entity link from a task. |
| list_entity_tasksC | Get all tasks linked to a specific entity (customer, contact, transaction, etc.). |
| add_task_noteA | Add a progress note to a task without changing its status. Useful for logging updates, blockers, or partial progress mid-task. |
| assign_taskA | Assign or reassign a task to a team member or AI agent. Use a FOUNDERS_OS_USER_ID for humans, '@claude' or '@gpt' for AI agents, or pass an empty string to unassign. A task has exactly one assignee by design - the single accountable owner ('one neck to grab') - so assigning replaces the current owner rather than adding a second. For others who are involved, name them in the task description or use @person tags. |
| get_task_summaryA | Dashboard-style summary of the task queue: overdue, due today, upcoming, counts by status, by assignee, and a dedicated AI tasks section for tasks assigned to @-prefixed agents. Call at session start to orient on what needs attention. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| list_tagsA | List all registered tags for the current company. Returns name, slug, color, and description for each tag. Use this to see what tags are available before tagging tasks or customers. |
| preview_tagsA | Validate tag names and return the same warnings tagging would produce (bare contact name, customer/org match, missing ! or # prefix, typo) WITHOUT registering anything. Read-only - nothing is persisted. Call when you want to show how a tag name would be classified before committing it. Returns { warnings, auto_registered: [] }; auto_registered is always empty. |
| create_tagA | Register a new tag in the tag registry. The slug (lowercase, hyphenated form) must be unique per company. Returns an error if a tag with the same slug already exists. |
| rename_tagA | Rename a registered tag. Updates the display name and slug. If the tag is in use and propagate is not explicitly set, a |
| remove_tagA | Remove a tag by archiving (hides from active views, recoverable) or permanently deleting. On first call, returns a |
| memory_storeB | Store a specific memory entry. Use scope='org' for team-wide visibility, 'personal' for caller only. Call this whenever you learn something worth remembering across sessions. |
| memory_recallA | Semantically search stored memories and return the most relevant results. Call at the start of any project session to load prior context. |
| memory_forgetA | Delete a specific memory entry by its ID. For org-scoped memories, a |
| memory_updateA | Update an existing memory's content in place. Re-embeds the new content for accurate future recall. For org-scoped memories, returns a conflict preview showing the before/after change for user confirmation. Pass confirm=true to apply after reviewing. |
| memory_summarize_and_storeA | Distill a session summary into a memory entry and store it. Pass a full narrative description of what happened — the more detail the better. Call at the end of meaningful sessions. |
| add_transactionA | Record an income or expense transaction. Automatically updates the account balance. Provide a positive amount — the sign is applied based on the category type. |
| list_transactionsB | List financial transactions with optional date range and account filters. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| set_transaction_customerA | Attribute an existing transaction to a customer, or detach it. Pass a customer_id to attribute the transaction, or null to clear the attribution. |
| add_categoryB | Create an income or expense category. |
| list_categoriesC | List all financial categories, optionally filtered by type. |
| add_accountA | Create a capital account (e.g. bank account, credit card, wallet). |
| list_accountsA | List all capital accounts with their current balances. |
| transfer_between_accountsA | Record a transfer of funds between two capital accounts. Both legs are marked exclude_from_reports=true so they don't skew P&L. If the inflow leg fails after the outflow succeeds, the outflow is automatically reversed to keep account balances consistent. For full atomicity, a future migration will wrap both legs in a single DB transaction. |
| get_pl_reportA | Return a profit & loss summary grouped by category for a given date range. Excludes transactions marked exclude_from_reports. Pass |
| remove_transactionA | Remove a transaction by archiving (hides from views and reports, recoverable) or permanently deleting (reverses the balance effect). On first call, returns a |
| get_financial_summaryB | Return a snapshot of the company's financial position: total assets across all accounts, plus year-to-date income and expenses. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| remove_accountA | Remove a financial account by archiving (hides from active views, recoverable) or permanently deleting. On first call, returns a |
| remove_categoryA | Remove a financial category by archiving (hides from active views, recoverable) or permanently deleting. On first call, returns a |
| set_financial_accessA | Grant or restrict a team member's access to financial tools. Requires owner role. Access levels: 'none' = no financial tools; 'read' = view only (balances, transactions, reports); 'write' = full access including add, edit, and delete. Owners cannot set their own access to 'none' or 'read' if they are the last owner — this would lock the company out of financial management. |
| get_financial_accessA | Check a user's financial access level. Any user can check their own access. Owners can check any user by passing target_user_id. |
| get_audit_logA | Read the immutable audit log for this company. Owners can read all entries (scope='all'). Any member can read their own entries (scope='mine'). Covers financial transactions, CRM deletes, org memory changes, playbook runs, access management, and member changes. Records cannot be modified or deleted. |
| list_membersA | List all team members in this company with their owner status and financial access level. Any member can call this — you don't need to be an owner to see the roster. |
| add_memberA | Add a team member to the company. Creates their company_members row with default access (no financial access, not an owner). Use set_financial_access to grant financial access, and set_member_owner to grant owner status. Requires owner role. |
| set_member_ownerA | Promote or demote a team member's owner status. Owners can manage financial access, add/remove members, and read the audit log. Promoting automatically grants 'write' financial access. You cannot demote the last remaining owner — add another owner first. Requires owner role. |
| remove_memberA | Remove a team member from the company. Deletes their company_members row, revoking all financial access. Their historical data (tasks, interactions, transactions) is preserved. Cannot remove the last owner. Requires owner role. |
| subscribe_feedA | Subscribe to an RSS, Atom, or JSON Feed. Fetches once to populate metadata if this is the first subscription to this URL in the company. Tags classify the feed (e.g. ['tech', 'ai']). Set pinned=true to include in morning briefing. |
| unsubscribe_feedA | Unsubscribe from a feed. Only removes your subscription - other team members and the shared catalog entry are not affected. Bookmarks from this feed are preserved. |
| list_feedsA | List all subscribed RSS feeds, optionally filtered by tag or pinned status. Returns feed metadata from the shared catalog along with per-user tags and pinned status. |
| pin_feedA | Pin a feed so it appears in the morning briefing. Pinned feeds are fetched during session start to generate headline summaries. |
| unpin_feedA | Unpin a feed so it no longer appears in the morning briefing. The feed remains subscribed - you just won't see headlines in session start. |
| import_starter_feedsA | Import a curated starter feed list covering tech, AI, business, news, crypto, engineering, and more. Skips any feeds you're already subscribed to. A subset of feeds are pinned by default for the morning briefing. |
| refresh_feedsA | Force-refresh feed data by clearing the cache. Optionally refresh a specific feed and update its catalog metadata. If no feed_id is given, clears the entire cache. |
| get_feed_itemsA | Fetch the latest items from subscribed feeds. Returns a numbered summary list with title, author, date, and whether full content is available. Use read_feed_item with the item number to get full content. Filter by feed_id for a specific feed, or by tag for a topic. |
| read_feed_itemA | Read the full content of a feed item by its index number (from get_feed_items). If the feed provides full article content, it is returned as HTML. If only a summary is available, the link to the original article is returned instead. |
| bookmark_itemA | Save a feed item for later. Snapshots the item content so it persists beyond the cache. Use the feed_url and item index number from get_feed_items. |
| list_bookmarksA | List saved feed item bookmarks, newest first. Returns title, summary, source feed, and link for each bookmark. |
| remove_bookmarkA | Remove a saved bookmark by its ID. |
| get_feed_briefingA | Generate a compact headline briefing from pinned feeds for the morning dashboard. Returns one headline per tag, capped at 8 total. Designed to be included in get_session_start without slowing it down. Only fetches pinned feeds. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| get_entity_cardA | Get a complete picture of any entity: the record itself, all open tasks linked to it, recent interactions, and any linked transactions. Replaces multiple separate calls when you need to answer 'what's going on with X?' |
| get_session_startA | Session orientation pointer. Returns today's date and a list of tools to call in parallel for a complete morning briefing. Does not fetch data itself - call the listed tools to get the actual content. Use this at the start of every session or when the user says 'start my day', 'catch me up', or similar. The response includes a rendering_contract field that defines the four-tier render ladder used across every founders-os tool for the rest of the session - read it before composing any founders-os output. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| get_weekly_retroA | Completed-task retrospective for a given week. Groups done tasks by their first tag, includes completion notes as quotes, and optionally formats as a LinkedIn-ready draft. Useful for weekly reviews, standup prep, and public updates. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| get_stuck_listA | Surface stuck, stale, and overdue tasks that need triage. Returns in_progress tasks untouched for N days, blocked tasks, and overdue tasks (todo or in_progress with past due date). Each row includes days_stale and a suggested triage action. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| checkpointA | End-of-session bookend to get_session_start. Call when the user says 'checkpoint', 'let's checkpoint', or 'wrap up this session'. Returns the ordered checkpoint procedure for the agent to execute (summarize, capture repo changes as commit links, store the record, propose task candidates, write the handoff doc) plus the exact memory call to make and the previous checkpoint for continuity. This tool does not write anything itself - the agent performs the steps. Pass the project tag so the previous checkpoint can be loaded; if omitted, ask the user which project before storing. |
| get_project_historyA | Chronological timeline of stored memories for a single project. Use to review how a project has progressed over time, to answer 'where did we leave off', or to assemble a project narrative. Defaults to checkpoint entries (kind='checkpoint'); pass kind='all' to include every memory for the project. Ordered newest-first. This is the chronological companion to memory_recall, which is semantic and ranked. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| create_playbookA | Create a new reusable playbook template. A playbook is an ordered set of steps run against a customer to automate project setup. Add steps with add_playbook_step after creation. |
| update_playbookA | Update a playbook's name, slug, or description. Only provided fields are changed. Steps are not affected — use update_playbook_step for those. |
| remove_playbookA | Remove a playbook by archiving (hides from active views, recoverable) or permanently deleting. On first call, returns a conflict with ARCHIVE / DELETE / CANCEL options. Pass mode after the user decides. Run history is preserved in both cases. Tasks already created by previous runs are not affected. |
| add_playbook_stepA | Add an ordered step to a playbook. Steps are either 'native_task' (created in Founders OS when the playbook runs) or 'external_action' (instructions returned for the AI to execute via connected MCP tools like GitHub or Slack). All text fields support {{placeholder}} syntax. Steps are ordered by order_index; append by using a value higher than existing steps. |
| list_playbooksA | List all defined playbooks for this company. Returns name, slug, description, and step count. Archived playbooks are hidden by default. |
| get_playbookA | Fetch a single playbook with its full ordered step list and connector requirements. Use before running to inspect what the playbook will do and which connectors it needs. |
| run_playbookA | Execute a playbook against a customer. Set preflight_only: true to inspect connector requirements and step breakdown WITHOUT executing — use this to check what's needed before committing to a run. In normal mode: creates all native_task steps as Founders OS tasks (linked to the customer) and returns external_action steps as structured instructions. IMPORTANT: After this tool returns in normal mode, check external_actions and execute each one using the appropriate connected MCP tools. If a connector is unavailable, create a native task using the fallback_task field from that step instead. The response always includes connector_requirements so you know what to check before executing. |
| get_playbook_runB | Fetch the execution log and status of a specific playbook run. |
| list_playbook_runsC | List playbook execution history. Optionally filter by playbook or customer. |
| update_playbook_stepB | Update any fields on a playbook step. Only provided fields are changed. Use to refine a step's title, description, due_offset, assigned_to, or action params. |
| remove_playbook_stepA | Remove a step from a playbook by archiving (hides from step list, recoverable) or permanently deleting. On first call, returns a conflict with ARCHIVE / DELETE / CANCEL options. Pass mode after the user decides. Tasks already created by previous runs are not affected. |
| create_projectA | Register a new project. Auto-creates a #-prefixed tag in the tag registry. Returns a conflict if a project with the same slug already exists. If the user mentions starting or working on a project that doesn't exist in the registry, suggest creating it. Example triggers: 'I'm starting a new project called X', 'working on project X', 'let's kick off X.' Always confirm before creating. |
| list_projectsA | List registered projects. Defaults to active projects only. Returns task counts per project (queried by tag). Also flags any #-prefixed tags in the registry that don't have a corresponding project record. |
| get_projectA | Get a full project card: project details, associated tag, and all tasks/customers carrying the project's tag. Tasks are grouped by status with recent items shown. |
| update_projectA | Update a project's name, description, or status. Name changes trigger a tag rename with propagation conflict if the tag is in use. Status change to 'completed' or 'archived' triggers a conflict if tasks with the project's tag are still open. |
| remove_projectA | Remove a project by archiving (sets status to 'archived', recoverable) or permanently deleting. On first call, returns a conflict with ARCHIVE / DELETE / CANCEL options. Pass mode after the user decides. The project's tag is kept in the registry on archive. On delete, the project record and its registry tag are removed but tasks/customers keep the tag string in their arrays (orphaned). Run history referencing this project is preserved. |
| restore_itemA | Restore a previously archived or soft-deleted item back to active state. Works for any entity type that supports archiving or deletion: customer, contact, task, tag, playbook, playbook_step, project, financial_account, financial_category, financial_transaction. Soft-deleted items are automatically purged after 30 days - restore before then to recover. Permission rules: org-scoped items can be restored by any company member; personal-scoped items (tasks) can only be restored by the creator or system owner. |
| list_deletedA | List recently soft-deleted items (the recoverable trash) for the current company so the user can pick one to restore or permanently delete. Returns each item's type, a human-readable label, when it was deleted, and the date it will be auto-purged. Defaults to the last 7 days with leftover demo fixtures hidden; pass days to widen the window, entity_type to filter, or include_demo to show demo data. Each item carries entity_id for use with restore_item or purge_item - present items to the user by label, never by id. Response includes a render field with tiered rendering guidance - check it before composing your reply. |
| purge_itemA | Permanently and irreversibly delete a soft-deleted item (purge it from the trash, skipping the 30-day recovery window). Only operates on items that are already soft-deleted - it refuses items that are still active. On the first call it returns a confirmation conflict; pass resolution: "confirm" only after the user explicitly agrees, or "cancel" to abort. Cascades to child rows the database cascades (e.g. a customer's contacts and interactions). To recover an item instead of destroying it, use restore_item. |
| purge_itemsA | Permanently and irreversibly delete many soft-deleted items at once (batch purge from the trash). Provide either an explicit |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/OurThinkTank/founders-os'
If you have feedback or need assistance with the MCP directory API, please join our Discord server