apple-mcp-notes 1.0.1__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.
- apple_mcp_notes-1.0.1/LICENSE +21 -0
- apple_mcp_notes-1.0.1/PKG-INFO +146 -0
- apple_mcp_notes-1.0.1/README.md +116 -0
- apple_mcp_notes-1.0.1/pyproject.toml +61 -0
- apple_mcp_notes-1.0.1/setup.cfg +4 -0
- apple_mcp_notes-1.0.1/src/apple_mcp_notes.egg-info/PKG-INFO +146 -0
- apple_mcp_notes-1.0.1/src/apple_mcp_notes.egg-info/SOURCES.txt +31 -0
- apple_mcp_notes-1.0.1/src/apple_mcp_notes.egg-info/dependency_links.txt +1 -0
- apple_mcp_notes-1.0.1/src/apple_mcp_notes.egg-info/entry_points.txt +3 -0
- apple_mcp_notes-1.0.1/src/apple_mcp_notes.egg-info/requires.txt +7 -0
- apple_mcp_notes-1.0.1/src/apple_mcp_notes.egg-info/top_level.txt +1 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/__init__.py +3 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/create_folder.applescript +50 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/create_note.applescript +130 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/delete_folder.applescript +42 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/delete_note.applescript +38 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/get_note.applescript +122 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/list_accounts.applescript +75 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/list_attachments.applescript +61 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/list_folders.applescript +107 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/list_notes.applescript +124 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/move_note.applescript +63 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/rename_folder.applescript +46 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/applescripts/update_note.applescript +181 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/config.py +43 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/models.py +133 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/notes_bridge.py +340 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/permissions.py +55 -0
- apple_mcp_notes-1.0.1/src/apple_notes_mcp/tools.py +542 -0
- apple_mcp_notes-1.0.1/tests/test_bridge.py +298 -0
- apple_mcp_notes-1.0.1/tests/test_config.py +14 -0
- apple_mcp_notes-1.0.1/tests/test_permissions.py +31 -0
- apple_mcp_notes-1.0.1/tests/test_tools.py +156 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Apple MCP Contributors
|
|
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.
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: apple-mcp-notes
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: Local Apple Notes MCP server for macOS
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/JonathanRReed/Apple-MCPs
|
|
7
|
+
Project-URL: Repository, https://github.com/JonathanRReed/Apple-MCPs
|
|
8
|
+
Project-URL: Changelog, https://github.com/JonathanRReed/Apple-MCPs/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Issues, https://github.com/JonathanRReed/Apple-MCPs/issues
|
|
10
|
+
Keywords: mcp,model-context-protocol,macos,apple,ai-agent,automation
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Environment :: MacOS X
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: MacOS
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: apple-mcp-common<2,>=1.0.0
|
|
24
|
+
Requires-Dist: mcp<3,>=2.0.0
|
|
25
|
+
Requires-Dist: pydantic>=2.12.0
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: pytest<10,>=8; extra == "dev"
|
|
28
|
+
Requires-Dist: ruff<1,>=0.12; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
|
|
31
|
+
<!-- mcp-name: io.github.jonathanrreed/apple-mcp-notes -->
|
|
32
|
+
|
|
33
|
+
# Apple Notes MCP
|
|
34
|
+
|
|
35
|
+
MCP server for Apple Notes on macOS.
|
|
36
|
+
|
|
37
|
+
Provides access to notes and folders for creation, organization, and management. Keep Notes as the system of record while enabling agents to read, create, update, move, and delete notes.
|
|
38
|
+
|
|
39
|
+
## When to use
|
|
40
|
+
|
|
41
|
+
- Notes-only workflows
|
|
42
|
+
- Stronger isolation than the all-in-one server
|
|
43
|
+
- Structured note and folder operations through the native Notes app
|
|
44
|
+
|
|
45
|
+
## What It Does
|
|
46
|
+
|
|
47
|
+
- List accounts and folders
|
|
48
|
+
- List, search, and manage notes (CRUD)
|
|
49
|
+
- Create, rename, and delete folders
|
|
50
|
+
- List note attachments
|
|
51
|
+
- Tool discovery helpers `search_tools` and `get_tool_info` for context-constrained clients
|
|
52
|
+
- Recent-note resources and organization prompts
|
|
53
|
+
- Health and permission checks: `notes_health`, `notes_permission_guide`, `notes_recheck_permissions`
|
|
54
|
+
|
|
55
|
+
## Install On This Mac
|
|
56
|
+
|
|
57
|
+
<details>
|
|
58
|
+
<summary>Quick start (uvx, from PyPI)</summary>
|
|
59
|
+
|
|
60
|
+
With [uv](https://docs.astral.sh/uv/getting-started/installation/) installed:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
uvx apple-mcp-notes
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
No clone, no venv management.
|
|
67
|
+
|
|
68
|
+
</details>
|
|
69
|
+
|
|
70
|
+
<details>
|
|
71
|
+
<summary>From a clone</summary>
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
git clone https://github.com/JonathanRReed/Apple-MCPs.git
|
|
75
|
+
cd Apple-MCPs
|
|
76
|
+
uv sync --all-packages
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
This builds one workspace environment with every server's entry point in `.venv/bin` (for example `.venv/bin/apple-notes-mcp`). You can also point an MCP client at `AppleNotes-MCP/start.sh`, which prefers `uv run` and falls back to a plain venv bootstrap (Python 3.11+ required).
|
|
80
|
+
|
|
81
|
+
</details>
|
|
82
|
+
|
|
83
|
+
## Install In AI Agents
|
|
84
|
+
|
|
85
|
+
<details>
|
|
86
|
+
<summary>Generic MCP client config</summary>
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"mcpServers": {
|
|
91
|
+
"apple-notes": {
|
|
92
|
+
"command": "uvx",
|
|
93
|
+
"args": ["apple-mcp-notes"],
|
|
94
|
+
"env": {
|
|
95
|
+
"APPLE_NOTES_MCP_SAFETY_MODE": "full_access"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Running from a clone instead? Use `/path/to/Apple-MCPs/AppleNotes-MCP/start.sh` as the command with empty `args`.
|
|
103
|
+
|
|
104
|
+
</details>
|
|
105
|
+
|
|
106
|
+
<details>
|
|
107
|
+
<summary>Claude Code example</summary>
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
claude mcp add --transport stdio --scope project apple-notes -- uvx apple-mcp-notes
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
</details>
|
|
114
|
+
|
|
115
|
+
## Safety Modes
|
|
116
|
+
|
|
117
|
+
- `safe_readonly`
|
|
118
|
+
- `safe_manage`
|
|
119
|
+
- `full_access`
|
|
120
|
+
|
|
121
|
+
## Transport
|
|
122
|
+
|
|
123
|
+
`stdio` is the default and recommended transport. Set `APPLE_NOTES_MCP_TRANSPORT=streamable-http` (with optional `APPLE_NOTES_MCP_HOST` and `APPLE_NOTES_MCP_PORT`) to serve Streamable HTTP instead.
|
|
124
|
+
|
|
125
|
+
## macOS Permissions
|
|
126
|
+
|
|
127
|
+
- Automation access to Notes is required
|
|
128
|
+
|
|
129
|
+
## Launch Checklist
|
|
130
|
+
|
|
131
|
+
- Add `uvx apple-mcp-notes` (or a clone's `AppleNotes-MCP/start.sh`) to your MCP client
|
|
132
|
+
- Reload or reconnect the client so the Notes tool surface is loaded into context
|
|
133
|
+
- Call `notes_health` first
|
|
134
|
+
- If Notes automation is blocked, call `notes_permission_guide`
|
|
135
|
+
- After changing macOS permissions, call `notes_recheck_permissions`
|
|
136
|
+
|
|
137
|
+
## Prompting Notes
|
|
138
|
+
|
|
139
|
+
- `tools/list` returns the full Notes tool surface. Context-constrained clients can use `search_tools` first, then `get_tool_info` for the Notes tool they need.
|
|
140
|
+
- Multiple accounts may each contain a Notes folder. Identify available accounts and folders on first use and set a default.
|
|
141
|
+
- Use Notes for reference material and saved context.
|
|
142
|
+
- Time-sensitive items should go to Reminders or Calendar instead.
|
|
143
|
+
|
|
144
|
+
## Related
|
|
145
|
+
|
|
146
|
+
- [Apple-Tools-MCP](../Apple-Tools-MCP/README.md)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<!-- mcp-name: io.github.jonathanrreed/apple-mcp-notes -->
|
|
2
|
+
|
|
3
|
+
# Apple Notes MCP
|
|
4
|
+
|
|
5
|
+
MCP server for Apple Notes on macOS.
|
|
6
|
+
|
|
7
|
+
Provides access to notes and folders for creation, organization, and management. Keep Notes as the system of record while enabling agents to read, create, update, move, and delete notes.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
- Notes-only workflows
|
|
12
|
+
- Stronger isolation than the all-in-one server
|
|
13
|
+
- Structured note and folder operations through the native Notes app
|
|
14
|
+
|
|
15
|
+
## What It Does
|
|
16
|
+
|
|
17
|
+
- List accounts and folders
|
|
18
|
+
- List, search, and manage notes (CRUD)
|
|
19
|
+
- Create, rename, and delete folders
|
|
20
|
+
- List note attachments
|
|
21
|
+
- Tool discovery helpers `search_tools` and `get_tool_info` for context-constrained clients
|
|
22
|
+
- Recent-note resources and organization prompts
|
|
23
|
+
- Health and permission checks: `notes_health`, `notes_permission_guide`, `notes_recheck_permissions`
|
|
24
|
+
|
|
25
|
+
## Install On This Mac
|
|
26
|
+
|
|
27
|
+
<details>
|
|
28
|
+
<summary>Quick start (uvx, from PyPI)</summary>
|
|
29
|
+
|
|
30
|
+
With [uv](https://docs.astral.sh/uv/getting-started/installation/) installed:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
uvx apple-mcp-notes
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
No clone, no venv management.
|
|
37
|
+
|
|
38
|
+
</details>
|
|
39
|
+
|
|
40
|
+
<details>
|
|
41
|
+
<summary>From a clone</summary>
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/JonathanRReed/Apple-MCPs.git
|
|
45
|
+
cd Apple-MCPs
|
|
46
|
+
uv sync --all-packages
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
This builds one workspace environment with every server's entry point in `.venv/bin` (for example `.venv/bin/apple-notes-mcp`). You can also point an MCP client at `AppleNotes-MCP/start.sh`, which prefers `uv run` and falls back to a plain venv bootstrap (Python 3.11+ required).
|
|
50
|
+
|
|
51
|
+
</details>
|
|
52
|
+
|
|
53
|
+
## Install In AI Agents
|
|
54
|
+
|
|
55
|
+
<details>
|
|
56
|
+
<summary>Generic MCP client config</summary>
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"apple-notes": {
|
|
62
|
+
"command": "uvx",
|
|
63
|
+
"args": ["apple-mcp-notes"],
|
|
64
|
+
"env": {
|
|
65
|
+
"APPLE_NOTES_MCP_SAFETY_MODE": "full_access"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Running from a clone instead? Use `/path/to/Apple-MCPs/AppleNotes-MCP/start.sh` as the command with empty `args`.
|
|
73
|
+
|
|
74
|
+
</details>
|
|
75
|
+
|
|
76
|
+
<details>
|
|
77
|
+
<summary>Claude Code example</summary>
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
claude mcp add --transport stdio --scope project apple-notes -- uvx apple-mcp-notes
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
</details>
|
|
84
|
+
|
|
85
|
+
## Safety Modes
|
|
86
|
+
|
|
87
|
+
- `safe_readonly`
|
|
88
|
+
- `safe_manage`
|
|
89
|
+
- `full_access`
|
|
90
|
+
|
|
91
|
+
## Transport
|
|
92
|
+
|
|
93
|
+
`stdio` is the default and recommended transport. Set `APPLE_NOTES_MCP_TRANSPORT=streamable-http` (with optional `APPLE_NOTES_MCP_HOST` and `APPLE_NOTES_MCP_PORT`) to serve Streamable HTTP instead.
|
|
94
|
+
|
|
95
|
+
## macOS Permissions
|
|
96
|
+
|
|
97
|
+
- Automation access to Notes is required
|
|
98
|
+
|
|
99
|
+
## Launch Checklist
|
|
100
|
+
|
|
101
|
+
- Add `uvx apple-mcp-notes` (or a clone's `AppleNotes-MCP/start.sh`) to your MCP client
|
|
102
|
+
- Reload or reconnect the client so the Notes tool surface is loaded into context
|
|
103
|
+
- Call `notes_health` first
|
|
104
|
+
- If Notes automation is blocked, call `notes_permission_guide`
|
|
105
|
+
- After changing macOS permissions, call `notes_recheck_permissions`
|
|
106
|
+
|
|
107
|
+
## Prompting Notes
|
|
108
|
+
|
|
109
|
+
- `tools/list` returns the full Notes tool surface. Context-constrained clients can use `search_tools` first, then `get_tool_info` for the Notes tool they need.
|
|
110
|
+
- Multiple accounts may each contain a Notes folder. Identify available accounts and folders on first use and set a default.
|
|
111
|
+
- Use Notes for reference material and saved context.
|
|
112
|
+
- Time-sensitive items should go to Reminders or Calendar instead.
|
|
113
|
+
|
|
114
|
+
## Related
|
|
115
|
+
|
|
116
|
+
- [Apple-Tools-MCP](../Apple-Tools-MCP/README.md)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "apple-mcp-notes"
|
|
7
|
+
version = "1.0.1"
|
|
8
|
+
description = "Local Apple Notes MCP server for macOS"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.11"
|
|
13
|
+
keywords = ["mcp", "model-context-protocol", "macos", "apple", "ai-agent", "automation"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 5 - Production/Stable",
|
|
16
|
+
"Environment :: MacOS X",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"Operating System :: MacOS",
|
|
19
|
+
"Programming Language :: Python :: 3.11",
|
|
20
|
+
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Programming Language :: Python :: 3.13",
|
|
22
|
+
"Programming Language :: Python :: 3.14",
|
|
23
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
24
|
+
]
|
|
25
|
+
dependencies = [
|
|
26
|
+
"apple-mcp-common>=1.0.0,<2",
|
|
27
|
+
"mcp>=2.0.0,<3",
|
|
28
|
+
"pydantic>=2.12.0",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[project.urls]
|
|
32
|
+
Homepage = "https://github.com/JonathanRReed/Apple-MCPs"
|
|
33
|
+
Repository = "https://github.com/JonathanRReed/Apple-MCPs"
|
|
34
|
+
Changelog = "https://github.com/JonathanRReed/Apple-MCPs/blob/main/CHANGELOG.md"
|
|
35
|
+
Issues = "https://github.com/JonathanRReed/Apple-MCPs/issues"
|
|
36
|
+
|
|
37
|
+
[project.scripts]
|
|
38
|
+
apple-notes-mcp = "apple_notes_mcp.tools:main"
|
|
39
|
+
apple-mcp-notes = "apple_notes_mcp.tools:main"
|
|
40
|
+
|
|
41
|
+
[project.optional-dependencies]
|
|
42
|
+
dev = [
|
|
43
|
+
"pytest>=8,<10",
|
|
44
|
+
"ruff>=0.12,<1",
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
[tool.setuptools]
|
|
48
|
+
package-dir = {"" = "src"}
|
|
49
|
+
|
|
50
|
+
[tool.setuptools.package-data]
|
|
51
|
+
apple_notes_mcp = ["applescripts/*.applescript"]
|
|
52
|
+
|
|
53
|
+
[tool.setuptools.packages.find]
|
|
54
|
+
where = ["src"]
|
|
55
|
+
|
|
56
|
+
[tool.pytest.ini_options]
|
|
57
|
+
pythonpath = ["src"]
|
|
58
|
+
testpaths = ["tests"]
|
|
59
|
+
|
|
60
|
+
[tool.uv.sources]
|
|
61
|
+
apple-mcp-common = { workspace = true }
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: apple-mcp-notes
|
|
3
|
+
Version: 1.0.1
|
|
4
|
+
Summary: Local Apple Notes MCP server for macOS
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
Project-URL: Homepage, https://github.com/JonathanRReed/Apple-MCPs
|
|
7
|
+
Project-URL: Repository, https://github.com/JonathanRReed/Apple-MCPs
|
|
8
|
+
Project-URL: Changelog, https://github.com/JonathanRReed/Apple-MCPs/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Issues, https://github.com/JonathanRReed/Apple-MCPs/issues
|
|
10
|
+
Keywords: mcp,model-context-protocol,macos,apple,ai-agent,automation
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Environment :: MacOS X
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Operating System :: MacOS
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: apple-mcp-common<2,>=1.0.0
|
|
24
|
+
Requires-Dist: mcp<3,>=2.0.0
|
|
25
|
+
Requires-Dist: pydantic>=2.12.0
|
|
26
|
+
Provides-Extra: dev
|
|
27
|
+
Requires-Dist: pytest<10,>=8; extra == "dev"
|
|
28
|
+
Requires-Dist: ruff<1,>=0.12; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
|
|
31
|
+
<!-- mcp-name: io.github.jonathanrreed/apple-mcp-notes -->
|
|
32
|
+
|
|
33
|
+
# Apple Notes MCP
|
|
34
|
+
|
|
35
|
+
MCP server for Apple Notes on macOS.
|
|
36
|
+
|
|
37
|
+
Provides access to notes and folders for creation, organization, and management. Keep Notes as the system of record while enabling agents to read, create, update, move, and delete notes.
|
|
38
|
+
|
|
39
|
+
## When to use
|
|
40
|
+
|
|
41
|
+
- Notes-only workflows
|
|
42
|
+
- Stronger isolation than the all-in-one server
|
|
43
|
+
- Structured note and folder operations through the native Notes app
|
|
44
|
+
|
|
45
|
+
## What It Does
|
|
46
|
+
|
|
47
|
+
- List accounts and folders
|
|
48
|
+
- List, search, and manage notes (CRUD)
|
|
49
|
+
- Create, rename, and delete folders
|
|
50
|
+
- List note attachments
|
|
51
|
+
- Tool discovery helpers `search_tools` and `get_tool_info` for context-constrained clients
|
|
52
|
+
- Recent-note resources and organization prompts
|
|
53
|
+
- Health and permission checks: `notes_health`, `notes_permission_guide`, `notes_recheck_permissions`
|
|
54
|
+
|
|
55
|
+
## Install On This Mac
|
|
56
|
+
|
|
57
|
+
<details>
|
|
58
|
+
<summary>Quick start (uvx, from PyPI)</summary>
|
|
59
|
+
|
|
60
|
+
With [uv](https://docs.astral.sh/uv/getting-started/installation/) installed:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
uvx apple-mcp-notes
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
No clone, no venv management.
|
|
67
|
+
|
|
68
|
+
</details>
|
|
69
|
+
|
|
70
|
+
<details>
|
|
71
|
+
<summary>From a clone</summary>
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
git clone https://github.com/JonathanRReed/Apple-MCPs.git
|
|
75
|
+
cd Apple-MCPs
|
|
76
|
+
uv sync --all-packages
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
This builds one workspace environment with every server's entry point in `.venv/bin` (for example `.venv/bin/apple-notes-mcp`). You can also point an MCP client at `AppleNotes-MCP/start.sh`, which prefers `uv run` and falls back to a plain venv bootstrap (Python 3.11+ required).
|
|
80
|
+
|
|
81
|
+
</details>
|
|
82
|
+
|
|
83
|
+
## Install In AI Agents
|
|
84
|
+
|
|
85
|
+
<details>
|
|
86
|
+
<summary>Generic MCP client config</summary>
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"mcpServers": {
|
|
91
|
+
"apple-notes": {
|
|
92
|
+
"command": "uvx",
|
|
93
|
+
"args": ["apple-mcp-notes"],
|
|
94
|
+
"env": {
|
|
95
|
+
"APPLE_NOTES_MCP_SAFETY_MODE": "full_access"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Running from a clone instead? Use `/path/to/Apple-MCPs/AppleNotes-MCP/start.sh` as the command with empty `args`.
|
|
103
|
+
|
|
104
|
+
</details>
|
|
105
|
+
|
|
106
|
+
<details>
|
|
107
|
+
<summary>Claude Code example</summary>
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
claude mcp add --transport stdio --scope project apple-notes -- uvx apple-mcp-notes
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
</details>
|
|
114
|
+
|
|
115
|
+
## Safety Modes
|
|
116
|
+
|
|
117
|
+
- `safe_readonly`
|
|
118
|
+
- `safe_manage`
|
|
119
|
+
- `full_access`
|
|
120
|
+
|
|
121
|
+
## Transport
|
|
122
|
+
|
|
123
|
+
`stdio` is the default and recommended transport. Set `APPLE_NOTES_MCP_TRANSPORT=streamable-http` (with optional `APPLE_NOTES_MCP_HOST` and `APPLE_NOTES_MCP_PORT`) to serve Streamable HTTP instead.
|
|
124
|
+
|
|
125
|
+
## macOS Permissions
|
|
126
|
+
|
|
127
|
+
- Automation access to Notes is required
|
|
128
|
+
|
|
129
|
+
## Launch Checklist
|
|
130
|
+
|
|
131
|
+
- Add `uvx apple-mcp-notes` (or a clone's `AppleNotes-MCP/start.sh`) to your MCP client
|
|
132
|
+
- Reload or reconnect the client so the Notes tool surface is loaded into context
|
|
133
|
+
- Call `notes_health` first
|
|
134
|
+
- If Notes automation is blocked, call `notes_permission_guide`
|
|
135
|
+
- After changing macOS permissions, call `notes_recheck_permissions`
|
|
136
|
+
|
|
137
|
+
## Prompting Notes
|
|
138
|
+
|
|
139
|
+
- `tools/list` returns the full Notes tool surface. Context-constrained clients can use `search_tools` first, then `get_tool_info` for the Notes tool they need.
|
|
140
|
+
- Multiple accounts may each contain a Notes folder. Identify available accounts and folders on first use and set a default.
|
|
141
|
+
- Use Notes for reference material and saved context.
|
|
142
|
+
- Time-sensitive items should go to Reminders or Calendar instead.
|
|
143
|
+
|
|
144
|
+
## Related
|
|
145
|
+
|
|
146
|
+
- [Apple-Tools-MCP](../Apple-Tools-MCP/README.md)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
src/apple_mcp_notes.egg-info/PKG-INFO
|
|
5
|
+
src/apple_mcp_notes.egg-info/SOURCES.txt
|
|
6
|
+
src/apple_mcp_notes.egg-info/dependency_links.txt
|
|
7
|
+
src/apple_mcp_notes.egg-info/entry_points.txt
|
|
8
|
+
src/apple_mcp_notes.egg-info/requires.txt
|
|
9
|
+
src/apple_mcp_notes.egg-info/top_level.txt
|
|
10
|
+
src/apple_notes_mcp/__init__.py
|
|
11
|
+
src/apple_notes_mcp/config.py
|
|
12
|
+
src/apple_notes_mcp/models.py
|
|
13
|
+
src/apple_notes_mcp/notes_bridge.py
|
|
14
|
+
src/apple_notes_mcp/permissions.py
|
|
15
|
+
src/apple_notes_mcp/tools.py
|
|
16
|
+
src/apple_notes_mcp/applescripts/create_folder.applescript
|
|
17
|
+
src/apple_notes_mcp/applescripts/create_note.applescript
|
|
18
|
+
src/apple_notes_mcp/applescripts/delete_folder.applescript
|
|
19
|
+
src/apple_notes_mcp/applescripts/delete_note.applescript
|
|
20
|
+
src/apple_notes_mcp/applescripts/get_note.applescript
|
|
21
|
+
src/apple_notes_mcp/applescripts/list_accounts.applescript
|
|
22
|
+
src/apple_notes_mcp/applescripts/list_attachments.applescript
|
|
23
|
+
src/apple_notes_mcp/applescripts/list_folders.applescript
|
|
24
|
+
src/apple_notes_mcp/applescripts/list_notes.applescript
|
|
25
|
+
src/apple_notes_mcp/applescripts/move_note.applescript
|
|
26
|
+
src/apple_notes_mcp/applescripts/rename_folder.applescript
|
|
27
|
+
src/apple_notes_mcp/applescripts/update_note.applescript
|
|
28
|
+
tests/test_bridge.py
|
|
29
|
+
tests/test_config.py
|
|
30
|
+
tests/test_permissions.py
|
|
31
|
+
tests/test_tools.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
apple_notes_mcp
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
on run argv
|
|
2
|
+
set folderName to item 1 of argv
|
|
3
|
+
set accountName to item 2 of argv
|
|
4
|
+
set parentFolderId to item 3 of argv
|
|
5
|
+
tell application "Notes"
|
|
6
|
+
set targetAccount to account accountName
|
|
7
|
+
if parentFolderId is not "" then
|
|
8
|
+
set targetFolder to folder id parentFolderId
|
|
9
|
+
set newFolder to make new folder at targetFolder with properties {name:folderName}
|
|
10
|
+
else
|
|
11
|
+
set newFolder to make new folder at targetAccount with properties {name:folderName}
|
|
12
|
+
end if
|
|
13
|
+
return "{" & quote & "folder" & quote & ":" & my folder_json(newFolder, targetAccount) & "}"
|
|
14
|
+
end tell
|
|
15
|
+
end run
|
|
16
|
+
|
|
17
|
+
on folder_json(fld, acc)
|
|
18
|
+
set folderId to my safe_text(id of fld)
|
|
19
|
+
set folderName to my safe_text(name of fld)
|
|
20
|
+
set accountId to my safe_text(id of acc)
|
|
21
|
+
set accountName to my safe_text(name of acc)
|
|
22
|
+
return "{" & quote & "folder_id" & quote & ":" & my json_string(folderId) & "," & quote & "name" & quote & ":" & my json_string(folderName) & "," & quote & "account_id" & quote & ":" & my json_string(accountId) & "," & quote & "account_name" & quote & ":" & my json_string(accountName) & "," & quote & "parent_folder_id" & quote & ":null," & quote & "parent_folder_name" & quote & ":null," & quote & "shared" & quote & ":false}"
|
|
23
|
+
end folder_json
|
|
24
|
+
|
|
25
|
+
on safe_text(valueText)
|
|
26
|
+
try
|
|
27
|
+
return valueText as text
|
|
28
|
+
on error
|
|
29
|
+
return ""
|
|
30
|
+
end try
|
|
31
|
+
end safe_text
|
|
32
|
+
|
|
33
|
+
on json_string(valueText)
|
|
34
|
+
set backslash to ASCII character 92
|
|
35
|
+
set escapedText to my replace_text(valueText as text, backslash, backslash & backslash)
|
|
36
|
+
set escapedText to my replace_text(escapedText, quote, backslash & quote)
|
|
37
|
+
set escapedText to my replace_text(escapedText, return, backslash & "n")
|
|
38
|
+
set escapedText to my replace_text(escapedText, linefeed, backslash & "n")
|
|
39
|
+
return quote & escapedText & quote
|
|
40
|
+
end json_string
|
|
41
|
+
|
|
42
|
+
on replace_text(sourceText, findText, replaceText)
|
|
43
|
+
set originalDelimiters to AppleScript's text item delimiters
|
|
44
|
+
set AppleScript's text item delimiters to findText
|
|
45
|
+
set sourceItems to text items of sourceText
|
|
46
|
+
set AppleScript's text item delimiters to replaceText
|
|
47
|
+
set resultText to sourceItems as text
|
|
48
|
+
set AppleScript's text item delimiters to originalDelimiters
|
|
49
|
+
return resultText
|
|
50
|
+
end replace_text
|