Local DevLog MCP
Local DevLog MCP collects Git push attempts across repositories, helps create/review/approve daily development logs, and publishes approved logs to Notion and Apple Calendar with previews, confirmations, and status tracking.
Check MCP connectivity with
ping.Query Git pre-push attempts for a date with
get_daily_activityas evidence, not proof of successful pushes.Save, list, read, update, and approve versioned daily drafts with immutable revisions and explicit approval.
Validate Notion connection/schema, preview a Work Log plus selected Next Action Tasks, publish them, and check retry status.
Validate Apple Calendar access, preview one all-day event, publish it, and check publication status.
Prevent duplicate daily publications using workDate + timezone identity, with independent Notion and Calendar states.
Integrates with local Git repositories via a pre-push hook to record push attempts, collect commit metadata, and verify current remote state for daily activity reporting.
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., "@Local DevLog MCP Show today's Git activity and save it as a daily draft for review"
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.
Local DevLog MCP
Local DevLog MCP is a macOS-first, single-user MCP server that turns Git push attempts from multiple repositories into one reviewable daily development log. The MCP client supplies the AI; this project does not call an external LLM API or run a background daemon.
Current release candidate: v0.5.0. The implemented workflow is Git collection → AI-proposed Daily Draft → explicit approval → one Notion Work Log and one Apple Calendar all-day event per work date and timezone.
How it works
git push
→ fail-open pre-push hook (attempt signal only)
→ local atomic JSON storage
→ on-demand stdio MCP server
→ client LLM proposes one Daily Draft
→ user reviews and approves an exact version
→ separately confirmed Notion and/or Calendar publicationPush collection works while the MCP server is stopped. A captured event is never presented as proof that a push succeeded: later remote verification returns REMOTE_MATCH, REMOTE_MISMATCH, or UNKNOWN.
Related MCP server: commit-check-mcp
Features
Multiple Git repositories with safe, idempotent registration and removal.
Existing
pre-pushhook protection and fail-open collection.Credential-redacted push-attempt metadata, deterministic IDs, writer locks, and atomic JSON replacement.
Date and timezone-based Git activity queries with remote-state verification.
Versioned Daily Drafts with optimistic edits, immutable approved versions, MCP Apps review UI, and Elicitation-first approval.
Read-only Notion authentication/schema validation and retry-safe publication.
One Repository-grouped Notion Work Log per
workDate + timezone; selected Next Actions become individual Tasks.Swift EventKit bridge for one all-day Apple Calendar event per daily identity.
Independent Notion and Calendar states, duplicate prevention, and partial-failure recovery.
Not implemented: Slack, KakaoTalk, a web UI, multi-user support, a background daemon, or embedded LLM calls.
Requirements
macOS 14 or newer
Node.js 20.19 or newer
pnpm 10.15.0
Git
Xcode Command Line Tools
A stdio MCP client such as Codex, Claude Code, or Claude Desktop
Optional: a Notion integration and writable Tasks/Work Logs databases
Install
git clone https://github.com/Kyoungwoong/report_local_mcp.git
cd report_local_mcp
corepack enable
corepack prepare pnpm@10.15.0 --activate
pnpm install --frozen-lockfile
pnpm typecheck
pnpm test
pnpm buildThe build produces dist/index.js, the self-contained MCP App, and an ad-hoc signed Calendar bridge. See Installation for the clean-install and upgrade checklist.
Connect from Codex
Use absolute paths. command -v node prints the Node executable and pwd prints the checkout path.
codex mcp add local-devlog -- /absolute/path/to/node /absolute/path/to/report_local_mcp/dist/index.js
codex mcp listCodex CLI and the Codex IDE extension share MCP configuration. In the TUI, run /mcp, then ask Codex to call ping; a healthy server returns pong. A project-scoped alternative is .codex/config.toml:
[mcp_servers.local-devlog]
command = "/absolute/path/to/node"
args = ["/absolute/path/to/report_local_mcp/dist/index.js"]
cwd = "/absolute/path/to/report_local_mcp"ChatGPT web/desktop does not read local Codex MCP configuration. See the current Codex MCP documentation.
Connect from Claude
Claude Code:
claude mcp add --scope user local-devlog -- /absolute/path/to/node /absolute/path/to/report_local_mcp/dist/index.js
claude mcp listRun /mcp inside Claude Code to inspect the connection and tools.
For a source checkout in Claude Desktop, edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"local-devlog": {
"command": "/absolute/path/to/node",
"args": [
"/absolute/path/to/report_local_mcp/dist/index.js"
]
}
}
}Fully quit and reopen Claude Desktop, then inspect Local MCP servers/Connectors and call ping. Anthropic recommends packaged desktop extensions for one-click distribution; v0.5.0 is a clone-and-build source release, not an .mcpb package.
MCP Apps and native form Elicitation depend on host support. Every Tool still returns structured JSON and text fallback when the UI is unavailable.
Register Git repositories
Build first because installed hooks use absolute paths to Node and dist/git/hook-runner.js:
pnpm run setup -- add /absolute/path/to/repository-one /absolute/path/to/repository-two
pnpm run setup -- list
pnpm run setup -- timezone Asia/Seoul
pnpm run setup -- remove /absolute/path/to/repository-oneUse pnpm run setup, including run: pnpm 10 reserves pnpm setup for pnpm itself.
Setup validates each Git repository and prevents duplicate registration. It respects repository-local core.hooksPath, refuses external/shared hook paths, and refuses to overwrite an existing pre-push. Removal verifies the exact installed hook hash and never deletes a modified or third-party hook. Moving this checkout or changing the Node executable requires removing and re-adding registered repositories.
Configure Notion
Create a Notion internal integration, share the Tasks and Work Logs databases with it, and copy the example:
cp .env.example .envNOTION_TOKEN=
NOTION_TASKS_DATABASE_ID=
NOTION_TASKS_DATA_SOURCE_ID=
NOTION_WORKLOGS_DATABASE_ID=
NOTION_WORKLOGS_DATA_SOURCE_ID=Database IDs identify the parent containers; Data Source IDs identify the query/create targets in the current Notion API. Providing both is recommended. The loader also accepts one usable ID per target and reports legacy Database fields that contain Data Source IDs.
Required Tasks properties:
Property | Type | Required option |
Name | title | — |
Due Date | date | — |
Local Id | rich_text | — |
Status | select | TODO |
Priority | select | MEDIUM |
Required Work Logs properties:
Property | Type |
Name | title |
Date | date |
Repository | url |
Summary | rich_text |
Local ID | rich_text |
Validate without writing:
pnpm notion:validateThe API version is pinned to 2026-03-11. Validation never edits a schema or creates a page.
Configure Apple Calendar
pnpm build
pnpm run setup -- calendar list
pnpm run setup -- calendar set <calendar-identifier>calendar list is the explicit full-access permission request. Select only an existing writable Calendar; Local DevLog never creates, renames, or deletes a Calendar. If denied, enable access under System Settings → Privacy & Security → Calendars and retry.
The bridge is built from source and ad-hoc signed. Its Info.plist contains NSCalendarsFullAccessUsageDescription, and it targets macOS 14. Rebuilding after a code change may require permission again because an ad-hoc code identity is tied to that build. See Installation for signing and future notarized-binary requirements.
Daily development log workflow
Ask the MCP client to call
get_daily_activityfor a real local date and summarize only the returned Git evidence.Save the proposal with
save_daily_draft, including itssourceFingerprintand source event IDs. Saving does not approve anything.Review with
get_daily_draftorlist_daily_drafts; edit withupdate_daily_draftand the currentexpectedVersion.Explicitly approve one
draftIdandversionthroughapprove_daily_draft.Preview and separately authorize either external target.
Approved drafts are immutable. New Git activity after approval produces sourceChangedAfterApproval; v0.5.0 does not automatically amend already published records.
Publish to Notion
Call
preview_notion_publicationwith the approved version and zero-basedselectedNextActionIndexes.Review the single Work Log, selected Tasks, Local IDs, and
previewFingerprint.Explicitly confirm
publish_to_notionwith the same selection and fingerprint.Check
get_notion_publication_statusand retry only failed items when necessary.
All Work Items are grouped by Repository in one Work Log body. Only selected Next Actions become Tasks. Approval alone never publishes.
Publish to Apple Calendar
Optionally call
validate_calendar_connectionwithrequestPermission: false.Call
preview_calendar_publicationfor the exact approved version.Review the Calendar, all-day date, body, Notion links, and
previewFingerprint.Explicitly confirm
publish_to_calendarwith the same fingerprint.Check
get_calendar_publication_status.
The event uses the Draft's IANA timezone and never treats Git timestamps as work hours. Notion and Calendar publication states are independent.
Duplicate prevention
The daily identity is workDate + timezone, not the Draft ID. A day can have:
one Notion Work Log containing every Repository's approved Work Items;
one Apple Calendar all-day event;
any explicitly selected Next Action Tasks.
Retrying the same Draft adopts or skips existing records. A different Draft for an already published daily identity returns DAILY_PUBLICATION_CONFLICT; Local DevLog never silently overwrites or deletes the existing record.
Security and local data
The default data directory is:
~/Library/Application Support/local-devlog-mcp/It contains config.json, events.json, drafts.json, notion-publications.json, and calendar-publications.json. LOCAL_DEVLOG_DATA_DIR overrides this location for isolated tests. Files are written with restrictive permissions and atomic replacement; no Git diffs are stored.
The Notion token remains in the ignored .env file or process environment. Remote URLs and commit subjects are redacted for common credentials before persistence. stdio stdout is reserved for MCP protocol messages; diagnostics use stderr.
MCP Tools validate input with Zod and external writes require a persisted approved Draft, exact version, matching preview fingerprint, and a second confirmation. Native Elicitation is the strongest supported boundary. On clients without it, the exact-phrase fallback cannot prove human presence because an AI client can reproduce text; review the stored approvalMethod and enter publication confirmations yourself.
Testing
pnpm install --frozen-lockfile
pnpm typecheck
pnpm test
pnpm build
pnpm audit --audit-level moderateNormal tests use temporary Git repositories and mock Notion/EventKit adapters. They do not touch the user's repositories or external data. Read-only/live and write integrations are explicit opt-ins:
pnpm test:notion:integration
pnpm test:calendar:integration
# Do not run test:calendar:write without reviewing its required preview and confirmation.FAQ
Why is a successful
git pushnot marked as proven? The hook runs before Git knows the outcome. Later remote equality is evidence about current ref state, not proof of which command changed it.Why did setup reject my hook? Automatic chaining could change stdin and exit behavior, so existing hooks are protected.
Why is the MCP command silent? A stdio server waits for a client; silence is expected.
Why did Calendar permission appear again? The locally ad-hoc signed bridge changed after rebuilding.
Can the project update an already published day? Not in v0.5.0; use a future explicit amendment workflow.
Where are detailed fixes? See Troubleshooting.
Project status and license
See Architecture, Roadmap, and Changelog. Slack and KakaoTalk remain future ideas only.
Licensed under the MIT License; see LICENSE.
Available Tools
15 toolsapprove_daily_draftApprove daily draftADestructiveIdempotent
Approve one exact persisted draft version after explicit human confirmation. This does not publish externally.
Inputs: draftId (required), version (required), confirmation. Returns: ok, code, draft, message, +1 more
get_calendar_publication_statusBRead-only
Read local Apple Calendar publication state and verify the event when Calendar access is available.
Inputs: draftId (required), version (required). Returns: ok, code, result, message
get_daily_activityARead-only
Read Git pre-push attempts for a local calendar date. Results are attempts, not proof that pushes succeeded.
Inputs: date (required).
get_daily_draftGet daily draftBRead-only
Read a daily draft and all of its immutable revisions.
Inputs: draftId (required). Returns: ok, code, draft, message, +1 more
get_notion_publication_statusBRead-only
Read local per-item Notion publication and retry status for one draft version.
Inputs: draftId (required), version (required). Returns: ok, code, result, message
list_daily_draftsList daily draftsARead-only
List current daily draft versions, optionally filtered by date, timezone, or status.
Inputs: status, timezone, workDate. Returns: ok, code, drafts, message
pingBRead-only
Check MCP connectivity
Inputs: no named parameters. Returns: message
preview_calendar_publicationARead-only
Preview one all-day Apple Calendar event for an exact approved draft version. This performs no Calendar write.
Inputs: draftId (required), version (required). Returns: ok, code, result, message
preview_notion_publicationARead-only
Preview Work Logs and explicitly selected Tasks for one approved draft version. This performs no Notion writes.
Inputs: draftId (required), version (required), selectedNextActionIndexes (required). Returns: ok, code, result, message
publish_to_calendarADestructiveIdempotent
Publish an exact, previously previewed approved draft version to Apple Calendar after explicit user confirmation.
Inputs: draftId (required), version (required), previewFingerprint (required), confirmation. Returns: ok, code, result, message
publish_to_notionADestructiveIdempotent
Publish an exact, previously previewed approved draft version after explicit user confirmation.
Inputs: draftId (required), version (required), previewFingerprint (required), selectedNextActionIndexes (required), +1 more. Returns: ok, code, result, message
save_daily_draftSave daily draftBIdempotent
Persist an AI-proposed daily draft. This does not approve or publish it.
Inputs: summary (required), timezone (required), workDate (required), workItems (required), +3 more. Returns: ok, code, draft, message, +1 more
update_daily_draftUpdate daily draftB
Create a new immutable revision after checking the current version. Use REJECTED to reject and PENDING to edit or reopen.
Inputs: status (required), draftId (required), summary (required), workItems (required), +4 more. Returns: ok, code, draft, message, +1 more
validate_calendar_connectionAIdempotent
Inspect Apple Calendar permission and configured target. Set requestPermission only when the user wants the macOS full-access prompt.
Inputs: requestPermission. Returns: ok, code, result, message
validate_notion_connectionARead-only
Read Notion authentication, Database, Data Source, and property schemas without modifying Notion.
Inputs: no named parameters. Returns: ok, code, result, message
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 15 tools
Each tool targets a distinct action and resource: draft lifecycle, Notion publication, Calendar publication, and connectivity. The parallel Notion and Calendar tools are clearly separated by platform, and draft read/list/save/update/approve/preview/publish boundaries are explicit.
Nearly all tools follow a predictable snake_case verb_noun pattern, with parallel naming for Notion and Calendar workflows. The only outlier is the simple connectivity tool `ping`, which is conventional and does not disrupt the pattern.
Fifteen tools are well scoped for a local devlog workflow involving draft revisions, approval, Notion publication, and Calendar publication. Each tool appears to earn its place by covering a distinct lifecycle step or integration check.
The surface covers the core daily-draft lifecycle and mirrors publication pipelines for both Notion and Calendar with validation, preview, publish, and status tools. A minor gap is the lack of explicit task selection/discovery tools despite preview referencing selected Tasks, and retry handling is only implied through status.
Maintenance
Related MCP Connectors
Approval-first store operator MCP: drafts, reads, and shop tools. You still approve.
Team memory for AI coding agents and code reviews, reviewed by humans and served over MCP.
Remote MCP for Copilot CLI switch gate MCP, structured receipts, audit logs, and reviewer-ready evid
Create, update, and publish changelog entries on your Patchlog changelog from any MCP client.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for structured daily work diary management, enabling entries, standup summaries, weekly reports, full-text search, and automatic git commits.1433 PyPIMIT

commit-check-mcpofficial
AlicenseAqualityBmaintenanceEnables validation of commit messages, branch names, author info, push safety, and repository state using commit-check rules, accessible as MCP tools.834 PyPI1MIT- -licenseNot gradedqualityNot gradedmaintenanceEnables generating AI-powered standups from git activity, with risk flags and markdown digests, via MCP tools.-
- AlicenseNot gradedqualityAmaintenanceEnables enqueuing coding-agent branches and managing a local-first merge train with gated validation, explicit approval, and atomic Git ref updates through MCP.7MIT