suur-things-mcp 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- suur_things_mcp-0.3.0/.github/workflows/ci.yml +24 -0
- suur_things_mcp-0.3.0/.github/workflows/release.yml +32 -0
- suur_things_mcp-0.3.0/.gitignore +25 -0
- suur_things_mcp-0.3.0/LICENSE +25 -0
- suur_things_mcp-0.3.0/PKG-INFO +303 -0
- suur_things_mcp-0.3.0/README.md +277 -0
- suur_things_mcp-0.3.0/ROADMAP.md +96 -0
- suur_things_mcp-0.3.0/pyproject.toml +51 -0
- suur_things_mcp-0.3.0/src/suur_things_mcp/__init__.py +3 -0
- suur_things_mcp-0.3.0/src/suur_things_mcp/config.py +308 -0
- suur_things_mcp-0.3.0/src/suur_things_mcp/dashboard.py +1598 -0
- suur_things_mcp-0.3.0/src/suur_things_mcp/organize.py +140 -0
- suur_things_mcp-0.3.0/src/suur_things_mcp/reads.py +392 -0
- suur_things_mcp-0.3.0/src/suur_things_mcp/server.py +791 -0
- suur_things_mcp-0.3.0/src/suur_things_mcp/urlscheme.py +111 -0
- suur_things_mcp-0.3.0/tests/test_dashboard.py +343 -0
- suur_things_mcp-0.3.0/tests/test_urlscheme.py +87 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: astral-sh/setup-uv@v5
|
|
17
|
+
with:
|
|
18
|
+
enable-cache: true
|
|
19
|
+
- name: Sync deps
|
|
20
|
+
run: uv sync --dev
|
|
21
|
+
- name: Run tests
|
|
22
|
+
run: uv run pytest -q
|
|
23
|
+
# Data-route tests skip automatically when Things isn't present (Linux/CI);
|
|
24
|
+
# URL-building + dashboard-route tests run everywhere.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Publishes to PyPI when you publish a GitHub Release. Uses PyPI Trusted
|
|
4
|
+
# Publishing (OIDC) — no API token stored anywhere.
|
|
5
|
+
#
|
|
6
|
+
# One-time setup on PyPI (https://pypi.org/manage/account/publishing/):
|
|
7
|
+
# Project: suur-things-mcp · Owner: artyomsklyarov · Repo: suur-things-mcp
|
|
8
|
+
# Workflow: release.yml · Environment: pypi
|
|
9
|
+
# Then bump `version` in pyproject.toml, tag, and publish a GitHub Release.
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
release:
|
|
13
|
+
types: [published]
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
pypi-publish:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
environment:
|
|
22
|
+
name: pypi
|
|
23
|
+
url: https://pypi.org/p/suur-things-mcp
|
|
24
|
+
permissions:
|
|
25
|
+
id-token: write # required for Trusted Publishing
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
- uses: astral-sh/setup-uv@v5
|
|
29
|
+
- name: Build
|
|
30
|
+
run: uv build
|
|
31
|
+
- name: Publish to PyPI
|
|
32
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
|
|
11
|
+
# uv
|
|
12
|
+
uv.lock
|
|
13
|
+
|
|
14
|
+
# Tooling
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.mypy_cache/
|
|
17
|
+
.ruff_cache/
|
|
18
|
+
|
|
19
|
+
# macOS
|
|
20
|
+
.DS_Store
|
|
21
|
+
|
|
22
|
+
# Secrets — never commit your Things auth token
|
|
23
|
+
.env
|
|
24
|
+
*.local
|
|
25
|
+
.gstack/
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Artyom Sklyarov (https://suur.io)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
This project is an independent, unofficial integration. "Things" is a
|
|
24
|
+
trademark of Cultured Code GmbH & Co. KG. This project is not affiliated with,
|
|
25
|
+
authorized, or endorsed by Cultured Code.
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: suur-things-mcp
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: A safe, fast MCP server for the Things 3 task manager (Cultured Code) on macOS — reads from the local SQLite database, writes only through the official Things URL Scheme.
|
|
5
|
+
Project-URL: Homepage, https://suur.io
|
|
6
|
+
Project-URL: Source, https://github.com/artyomsklyarov/suur-things-mcp
|
|
7
|
+
Project-URL: Repository, https://github.com/artyomsklyarov/suur-things-mcp
|
|
8
|
+
Project-URL: Issues, https://github.com/artyomsklyarov/suur-things-mcp/issues
|
|
9
|
+
Author: Artyom Sklyarov
|
|
10
|
+
License: MIT
|
|
11
|
+
License-File: LICENSE
|
|
12
|
+
Keywords: claude,cultured-code,llm,macos,mcp,task-manager,things,things3,todo
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: MacOS X
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: MacOS
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Topic :: Office/Business :: Scheduling
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: mcp>=1.2.0
|
|
22
|
+
Requires-Dist: starlette>=0.37
|
|
23
|
+
Requires-Dist: things-py>=0.0.15
|
|
24
|
+
Requires-Dist: uvicorn>=0.30
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
|
|
27
|
+
# SUUR Things MCP
|
|
28
|
+
|
|
29
|
+
**Give any AI agent safe, structured access to your [Things 3](https://culturedcode.com/things/) tasks — plus a local, Things-faithful web dashboard with Kanban boards, an Eisenhower matrix, repo-linking, and a YouTube-thumbnail card view.**
|
|
30
|
+
|
|
31
|
+
[](LICENSE)
|
|
32
|
+

|
|
33
|
+

|
|
34
|
+
[](https://modelcontextprotocol.io)
|
|
35
|
+
|
|
36
|
+
An [MCP](https://modelcontextprotocol.io) server for **Things 3** (Cultured Code) on macOS. Let Claude Code, Claude Desktop, Codex, or any MCP-capable agent read and manage your tasks, projects, and areas — and get a local dashboard that looks like Things but adds the views Things doesn't have.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# 1. point your agent at it (Claude Code shown)
|
|
40
|
+
claude mcp add things -- uvx suur-things-mcp
|
|
41
|
+
# 2. (optional) open the dashboard
|
|
42
|
+
uvx suur-things-mcp dashboard # → http://127.0.0.1:8765
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
That's it. Reads work immediately with no token. Add a token (below) when you want the agent to *modify* existing tasks.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## What it is (and the one design decision that matters)
|
|
50
|
+
|
|
51
|
+
Two data paths, deliberately split:
|
|
52
|
+
|
|
53
|
+
- **Reads** come straight from the local Things SQLite database — instant and complete: Today, Upcoming, Inbox, Anytime, Someday, Logbook, Trash, full-text search, projects, areas, tags, and full item detail.
|
|
54
|
+
- **Writes** go *only* through the official [Things URL Scheme](https://culturedcode.com/things/support/articles/2803573/) — add to-dos/projects, update, complete, cancel, reschedule, move between projects, append checklist items.
|
|
55
|
+
|
|
56
|
+
**Why this matters:** Cultured Code's own [AI-integration guidance](https://culturedcode.com/things/support/articles/5510170/) is blunt — *writing directly to the Things database is unsafe and can corrupt it.* They endorse the URL Scheme as the safe automation path. This server follows that exactly: it **reads** the DB read-only and **never writes** to it. Every mutation is a `things:///` URL, the same mechanism Things documents for Shortcuts and AppleScript.
|
|
57
|
+
|
|
58
|
+
So an agent can't corrupt your database through this server even if it tries. The worst a write can do is what the URL Scheme itself allows.
|
|
59
|
+
|
|
60
|
+
> **Privacy:** an agent connected to this server can read your to-do and note content, which is then sent to whatever model you're using. Review your agent's privacy policy. Nothing here phones home; there's no telemetry and no bundled LLM.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Cool use cases
|
|
65
|
+
|
|
66
|
+
These are the workflows this unlocks once an agent can see and shape your task system:
|
|
67
|
+
|
|
68
|
+
- **Plan → project, instantly.** Hand Claude an implementation plan and the `plan_to_project` prompt; it materializes a real Things project — a to-do per step with sub-tasks as checklist items — in one `batch` call. (Things' URL Scheme can't create headings, so phases get folded into titles/notes rather than faked.)
|
|
69
|
+
- **"What should I work on in this repo?"** Link a Things project to a local git repo. From inside that repo, the `work_on_repo` prompt resolves which project you're in (via `CLAUDE_PROJECT_DIR` / cwd), pulls its open to-dos, and works the next one.
|
|
70
|
+
- **Sweep code TODOs into Things.** Point your agent at the codebase: it greps `TODO`/`FIXME`, and `batch`-creates to-dos with `file:line` references — no new tool needed, the agent already has Grep + this server.
|
|
71
|
+
- **Auto-organize a messy Inbox.** Hit the ✨ button on any folder (or use the `organize_folder` prompt). It spawns *your* agent **headlessly with zero tools and zero MCP**, so it can only *propose* cleaner titles/notes/tags — never write or be prompt-injected. You review every change before it's applied. (And yes, an agent can re-file Inbox items into the right projects — `update` supports moving via `list-id`.)
|
|
72
|
+
- **Eisenhower any project.** The **Priority Matrix** isn't a separate place — it's a view toggle on *every* list, project, and area. Open a project → **Matrix** → drag tasks (and the area's projects) into Do First / Schedule / Delegate / Don't Do.
|
|
73
|
+
- **A "watch later" wall.** A project full of YouTube links? Switch to the **Cards** view and they render as thumbnails with play buttons.
|
|
74
|
+
- **A glanceable portfolio board.** Saved Kanban boards where each card is a whole project or area (progress ring + open count), with one-click **Open in editor / terminal / GitHub** for linked repos.
|
|
75
|
+
- **One-call situational awareness.** `overview` returns a whole-system digest (counts, today, overdue, projects with no next action, recent completions) in a single call instead of ten.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Requirements
|
|
80
|
+
|
|
81
|
+
- macOS with [Things 3](https://culturedcode.com/things/) installed
|
|
82
|
+
- [`uv`](https://docs.astral.sh/uv/) (recommended) — or any Python ≥ 3.10
|
|
83
|
+
|
|
84
|
+
## Install
|
|
85
|
+
|
|
86
|
+
`uvx` runs it with no manual install or virtualenv:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
uvx suur-things-mcp # run the MCP server over stdio
|
|
90
|
+
uvx suur-things-mcp dashboard # run the dashboard instead
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Claude Code
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# read-only (no token)
|
|
97
|
+
claude mcp add things -- uvx suur-things-mcp
|
|
98
|
+
|
|
99
|
+
# read + write (modify existing items) — pass your token
|
|
100
|
+
claude mcp add things --env THINGS_AUTH_TOKEN=your-token-here -- uvx suur-things-mcp
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Claude Desktop / Codex / other MCP clients
|
|
104
|
+
|
|
105
|
+
Add to your client's MCP config (e.g. `claude_desktop_config.json`):
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"mcpServers": {
|
|
110
|
+
"things": {
|
|
111
|
+
"command": "uvx",
|
|
112
|
+
"args": ["suur-things-mcp"],
|
|
113
|
+
"env": { "THINGS_AUTH_TOKEN": "your-token-here" }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`THINGS_AUTH_TOKEN` is **optional**. Without it you can read everything and *create* new to-dos/projects. It's only needed to **modify existing items**.
|
|
120
|
+
|
|
121
|
+
### Bleeding edge (straight from `main`, before a release lands on PyPI)
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
uvx --from git+https://github.com/artyomsklyarov/suur-things-mcp suur-things-mcp
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Getting your Things auth token
|
|
128
|
+
|
|
129
|
+
1. **Things → Settings → General**
|
|
130
|
+
2. Enable **"Enable Things URLs"**
|
|
131
|
+
3. Click **Manage** and copy the token
|
|
132
|
+
|
|
133
|
+
Keep it secret — it grants write access via the URL Scheme. It's stored locally (see below), never in this repo.
|
|
134
|
+
|
|
135
|
+
## Updating
|
|
136
|
+
|
|
137
|
+
There's no custom "update" command — updates ride on whatever fetched the package. `uvx` caches, so:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
uvx --refresh suur-things-mcp # re-fetch the latest release, then restart your MCP client
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
If you installed it as a persistent tool:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
uv tool install suur-things-mcp # one-time
|
|
147
|
+
uv tool upgrade suur-things-mcp # update later
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Nuclear option (clear the cache): `uv cache clean suur-things-mcp`. From `main`, add `--refresh` to the git command above.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Tools (30)
|
|
155
|
+
|
|
156
|
+
### Read — no token required
|
|
157
|
+
|
|
158
|
+
| Tool | Returns |
|
|
159
|
+
|------|---------|
|
|
160
|
+
| `overview` | One-call system digest: counts, today, overdue, projects with no next action, recent completions |
|
|
161
|
+
| `get_today` | Today (incl. overdue + this evening) |
|
|
162
|
+
| `get_inbox` | Inbox |
|
|
163
|
+
| `get_upcoming` | Scheduled, future-dated to-dos |
|
|
164
|
+
| `get_anytime` / `get_someday` | Anytime / Someday lists |
|
|
165
|
+
| `get_logbook` | Recently completed/canceled (`limit`) |
|
|
166
|
+
| `get_deadlines` | To-dos with deadlines |
|
|
167
|
+
| `get_trash` | Trash |
|
|
168
|
+
| `search_todos` | Full-text search over titles + notes |
|
|
169
|
+
| `list_todos` | Filter by project / area / tag / status / bucket |
|
|
170
|
+
| `get_projects` / `get_areas` / `get_tags` | Structure (`include_items` for contents) |
|
|
171
|
+
| `get_item` | Full detail for any UUID |
|
|
172
|
+
| `current_link` / `list_links` | Repo-link lookups (see below) |
|
|
173
|
+
|
|
174
|
+
### Write — via the URL Scheme
|
|
175
|
+
|
|
176
|
+
| Tool | Token? |
|
|
177
|
+
|------|:------:|
|
|
178
|
+
| `add_todo`, `add_project` | no |
|
|
179
|
+
| `show` (navigate Things to a list/item) | no |
|
|
180
|
+
| `open_dashboard` (open the local board) | no |
|
|
181
|
+
| `link_repo`, `unlink_repo` | no (config only) |
|
|
182
|
+
| `batch` (bulk create/update via the `json` command) | only if it contains updates |
|
|
183
|
+
| `update_todo`, `update_project` | **yes** |
|
|
184
|
+
| `complete_todo`, `cancel_todo`, `schedule_todo` | **yes** |
|
|
185
|
+
| `add_checklist_items` | **yes** |
|
|
186
|
+
|
|
187
|
+
> The URL Scheme doesn't return a new item's UUID on create. After `add_todo`/`add_project`, use `search_todos` if you need the ID.
|
|
188
|
+
|
|
189
|
+
## Prompts
|
|
190
|
+
|
|
191
|
+
Packaged MCP **prompts** — workflows your client surfaces as slash commands (the exact name/prefix is client-controlled):
|
|
192
|
+
|
|
193
|
+
| Prompt | What it does |
|
|
194
|
+
|--------|--------------|
|
|
195
|
+
| `plan_to_project` | Turn an implementation plan into a Things project — a to-do per step, sub-tasks as checklist items — via `batch` (no headings; URL-Scheme limit) |
|
|
196
|
+
| `work_on_repo` | From inside a linked repo, resolve its Things project, pull open to-dos, work the next one |
|
|
197
|
+
| `organize_folder` | Propose clearer titles/notes/tags for a folder (reusing existing tags), review in chat, apply on approval |
|
|
198
|
+
| `weekly_review` | GTD weekly review — flag stalled projects, rotting Someday items, overdue deadlines; propose fixes |
|
|
199
|
+
| `triage_inbox` | Propose a project/area + tags + `when` per Inbox item; file on approval |
|
|
200
|
+
| `whats_next` | Rank Today/Anytime by deadline, age, and your tags; recommend the single next task |
|
|
201
|
+
| `standup` | Yesterday's logbook + today + blocked, formatted to paste into Slack or a PR |
|
|
202
|
+
| `capture_todos` | Sweep code `TODO`/`FIXME` into Things to-dos with `file:line` references |
|
|
203
|
+
| `close_from_commit` | Complete the Things to-dos a git commit resolved |
|
|
204
|
+
| `repo_to_issue` | Promote a Things to-do to a GitHub issue (via `gh`) and link them |
|
|
205
|
+
| `issues_to_todos` | Mirror a repo's open GitHub issues into Things to-dos under its linked project |
|
|
206
|
+
|
|
207
|
+
The GTD and code/GitHub prompts use only the existing tools (plus the agent's own Grep/Bash/`gh`) — the server stays dumb. A few more polish ideas live on the [roadmap](ROADMAP.md).
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Dashboard
|
|
212
|
+
|
|
213
|
+
A local web UI that mirrors the Things look (real glyphs, typography, edit card) and adds the views Things lacks. Binds `127.0.0.1` only, reads the DB read-only, and **always runs on port 8765** (it reuses a live instance instead of spawning duplicates).
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
uvx suur-things-mcp dashboard # opens http://127.0.0.1:8765
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Or have the agent open it with the `open_dashboard` tool.
|
|
220
|
+
|
|
221
|
+
**Sidebar** — Things' built-in lists (with their real colored icons), a **Priority Matrix** entry, your saved **project boards**, and areas with nested projects + progress rings. An area with only projects shows them as **project cards**. Tag **filter chips** sit under any list's title. A **search box** runs `things.search` over your whole database.
|
|
222
|
+
|
|
223
|
+
**Three views, toggled per list (List / Matrix / Cards):**
|
|
224
|
+
|
|
225
|
+
- **List** — the faithful Things grouped list (by project/heading), with the Things-style inline edit card (checkbox + title, Notes, When/deadline/tag pills, footer toolbar). Edits **save on close, only if you changed something.**
|
|
226
|
+
- **Matrix** — an Eisenhower matrix over *that* list's tasks. Drag into **Do First / Schedule / Delegate / Don't Do**. On an area, its **projects** are draggable too. Priority is **global per task** (set it anywhere, see it everywhere). The sidebar **Priority Matrix** entry is the matrix over Today.
|
|
227
|
+
- **Cards** — task cards; anything with a **YouTube link renders as a thumbnail** (other links get a 🔗 tile). Great for a "watch later" project.
|
|
228
|
+
|
|
229
|
+
**Project boards** — saved portfolio Kanbans. Each **card is a project or whole area** (progress ring + open count), dragged between **stage columns** (Backlog / In Progress / On Hold / Done). Add multiple named boards with the + on the Boards group; configure name / columns / included areas+projects in the ⚙ panel (auto-saves).
|
|
230
|
+
|
|
231
|
+
**Repo links** — link a Things project/area to one or more local git repos (an app + its website, say). GitHub is **auto-detected** from the repo's `origin` remote. Board cards get **Open in editor (⌨) / terminal (❯) / GitHub (↗)** buttons; set your editor command + terminal app in **⚙ Preferences** (or `SUUR_THINGS_EDITOR` / `SUUR_THINGS_TERMINAL`).
|
|
232
|
+
|
|
233
|
+
Stage placement and priority quadrants are **browser-side overlays** — Things has no such concept — so dragging needs **no token**. Editing a task's fields *does* write to Things (URL Scheme) and needs `THINGS_AUTH_TOKEN`; without it the edit card is read-only.
|
|
234
|
+
|
|
235
|
+
**Live & low-friction:** the board **auto-refreshes** (~25 s poll; it pauses while you're editing, dragging, filtering, searching, or in a background tab, and keeps your scroll position). **Drag a task onto Today / Anytime / Someday** in the sidebar to reschedule it (`when=`). Your current view + theme survive a refresh (state is in the URL hash).
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Where your data lives
|
|
240
|
+
|
|
241
|
+
Three tiers — important if you switch machines:
|
|
242
|
+
|
|
243
|
+
1. **Real task data → Things' own database.** Anything you change that's a Things field (title, notes, when, deadline, tags, complete/cancel, move) is written via the URL Scheme into Things, and syncs across your devices through Things Cloud like normal. This server never stores your tasks.
|
|
244
|
+
2. **Dashboard config → one local JSON file.**
|
|
245
|
+
- `~/.config/suur-things-mcp/board.json` — your boards, Priority-Matrix assignments, repo links, and prefs (keyed by stable Things UUIDs).
|
|
246
|
+
- `~/.config/suur-things-mcp/token` — your Things auth token (chmod 600).
|
|
247
|
+
|
|
248
|
+
Not in the browser, not in Things. (`$XDG_CONFIG_HOME` is honored if set.)
|
|
249
|
+
3. **Browser localStorage** — only cosmetic state (light/dark, which areas are collapsed). Nothing you'd miss.
|
|
250
|
+
|
|
251
|
+
**Backup / move machines:** copy or symlink `~/.config/suur-things-mcp/` (e.g. into Dropbox). Two caveats: the **token is a secret** (fine in personal storage, never in a public repo), and **repo links store absolute paths** that are machine-specific — the UUID-keyed boards/priorities port cleanly, the paths may need repointing.
|
|
252
|
+
|
|
253
|
+
## Configuration
|
|
254
|
+
|
|
255
|
+
| Env var | Purpose |
|
|
256
|
+
|---------|---------|
|
|
257
|
+
| `THINGS_AUTH_TOKEN` | Required to modify existing items (tools) and to edit/move in the dashboard |
|
|
258
|
+
| `THINGS_DB` | Override the SQLite path (e.g. point at a backup for testing) |
|
|
259
|
+
| `SUUR_THINGS_CONFIG` | Override the `board.json` path |
|
|
260
|
+
| `SUUR_THINGS_EDITOR` / `SUUR_THINGS_TERMINAL` | Default editor command / terminal app for repo-launch buttons |
|
|
261
|
+
| `SUUR_THINGS_AGENT` | Which CLI the ✨ organize button spawns (`claude` / `codex`) |
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## How it works
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
┌──────────────┐ read (SQLite, read-only) ┌──────────────────────────┐
|
|
269
|
+
│ MCP client │ ─────────────────────────────▶ │ things.py → main.sqlite │
|
|
270
|
+
│ (Claude/etc) │ └──────────────────────────┘
|
|
271
|
+
│ + │ write (things:/// URL) ┌──────────────────────────┐
|
|
272
|
+
│ dashboard │ ─────────────────────────────▶ │ open -g → Things.app │
|
|
273
|
+
└──────────────┘ └──────────────────────────┘
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Reads use the excellent [`things.py`](https://github.com/thingsapi/things.py), which opens the DB read-only and absorbs every schema quirk. Writes are built and URL-encoded in [`urlscheme.py`](src/suur_things_mcp/urlscheme.py) and fired with `open -g`. The dashboard is a single self-contained Starlette app (no build step, no external JS) served from [`dashboard.py`](src/suur_things_mcp/dashboard.py).
|
|
277
|
+
|
|
278
|
+
**The server stays dumb on purpose.** It returns clean structured data and ships packaged prompts; the judgment (prioritize, triage, synthesize) lives in *your* agent, not a hardcoded rules engine. There is no bundled model and no API key.
|
|
279
|
+
|
|
280
|
+
### Known limits (Things' URL Scheme, not us)
|
|
281
|
+
|
|
282
|
+
- Creating **headings** isn't supported by the URL Scheme — only the app can.
|
|
283
|
+
- Create commands don't return the new UUID (search for it afterward).
|
|
284
|
+
- macOS only (Things is Mac/iOS; there's no cloud API).
|
|
285
|
+
|
|
286
|
+
## Development
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
git clone https://github.com/artyomsklyarov/suur-things-mcp
|
|
290
|
+
cd suur-things-mcp
|
|
291
|
+
uv sync
|
|
292
|
+
uv run pytest # unit tests — URL building + dashboard, no Things required
|
|
293
|
+
uv run suur-things-mcp # run the server over stdio
|
|
294
|
+
uv run suur-things-mcp dashboard
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Tests build and assert URL-Scheme strings and dashboard endpoints without touching your real database, so they're safe to run anywhere. Contributions welcome — see the [roadmap](ROADMAP.md) for what's planned.
|
|
298
|
+
|
|
299
|
+
## Credits & license
|
|
300
|
+
|
|
301
|
+
Built by [Artyom Sklyarov](https://suur.io) · [suur.io](https://suur.io). MIT licensed — see [LICENSE](LICENSE).
|
|
302
|
+
|
|
303
|
+
Independent and unofficial. "Things" is a trademark of Cultured Code GmbH & Co. KG. Not affiliated with or endorsed by Cultured Code. Reads via [`things.py`](https://github.com/thingsapi/things.py); built on the [Model Context Protocol](https://modelcontextprotocol.io).
|