goat
Allows receiving and answering questions via Slack, enabling interaction with the fact store through Slack messages.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@goattell me about my habits from last month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
goat
A personal assistant backend. It stores facts in Postgres or SQLite, fills them from importers on a schedule, and answers questions about them over Slack, MCP, SMS, or a terminal REPL.
Facts carry two timestamps: when the fact is about, and when goat learned it. Re-running an importer with unchanged data writes nothing.
Install
uv add "goat-butler @ git+https://github.com/phin-tech/goat"Extras: postgres, agent (pydantic-ai), cli, mcp, slack, sms,
weather, migrations, and all for every one of them. SQLite needs none.
uv add "goat-butler[all] @ git+https://github.com/phin-tech/goat"To work on goat itself:
git clone https://github.com/phin-tech/goat
cd goat
uv sync
uv run pytestThe suite runs against both SQLite and Postgres. Postgres comes from
docker compose up -d.
Related MCP server: personal-mcp-context
Start a shed
A shed is one deployment: a directory with a shed.py that builds a Shed, and
a .env holding the credentials. goat init writes both.
uv run goat init ~/my-shed
cd ~/my-shed
uv sync
goat migrate
goat ingest
goat replDefaults to SQLite, so this runs with no database server and no API key. Set a
model provider key in .env for goat brief and the REPL's ask.
.env can hold 1Password references instead of secrets. goat resolves them at
startup via the op CLI, so the file is safe to read aloud or paste:
OPENROUTER_API_KEY=op://Private/OpenRouter/credentialCommands
| scaffold a new shed |
| create or update the schema |
| run every importer |
| compose a brief; |
| inspect the store |
| interactive session |
| serve the store over MCP on stdio |
What goes where
goat holds the mechanism: the store, importers, delivery, tools, the CLI. A shed
holds the values: coordinates, model, credentials, prompt, schedule.
OpenMeteoImporter lives in goat because a latitude is a constructor argument.
The latitude lives in your shed.
Docs
docs/design/fact-store.md— schema, decisions, and the ones that were reverseddocs/mcp.md— MCP server and Claude Desktop configdocs/slack.md— Slack app setupdocs/weather.md— weather sourcesskills/— Claude Code skills for setup and daily use
This server cannot be deployed
Maintenance
Related MCP Connectors
Memory for AI agents that knows what is still true. Typed bi-temporal facts, EU-hosted.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Person-owned AI memory that learns, not just stores — portable context for any MCP client.
Governed personal world model and memory for your AI agent. Pair once, connect over MCP.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceLocal, private memory layer for notes and files with temporal reasoning and citation. Enables agents to query and persist memories via the Model Context Protocol.12 npm2MIT
- FlicenseNot gradedqualityCmaintenanceA Model Context Protocol server that stores personal context as structured Markdown files with a knowledge graph, enabling AI agents to query identity, devices, servers, and projects on-demand.-
- AlicenseNot gradedqualityBmaintenanceA privacy-first personal context engine that ingests personal photos and message exports, extracts cited facts, and serves a queryable profile over MCP for natural-language questions like 'when did I last see Sarah?'.MIT
- AlicenseNot gradedqualityAmaintenanceEnables agents to assert and recall typed facts with idempotent writes, freshness, and assurance verdicts. Provides MCP tools for persistent memory across sessions via SQLite-backed storage.54 npm1MIT