nws-mcp
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., "@nws-mcp preview adding a new publisher to the congregation"
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.
nws-mcp
An unofficial Model Context Protocol (MCP) server for New World Scheduler (NWS). It lets Claude and other MCP clients read and manage a congregation's NWS data headlessly: people, schedules, assignments, territories, public witnessing, public-speaker sharing, NWP app publishing, backups and more, without automating the Windows UI.
Disclaimer. Unofficial. Not affiliated with or endorsed by the developers of New World Scheduler. Uses your own NWS credentials; you are responsible for complying with NWS terms.
It works on the congregation's live shared data. Every write goes through a preview and an explicit confirmation step, and nothing is published to the NWP app or announced by push notification unless you ask for it.
Contents
Related MCP server: anki-sync-mcp
Features
62 tools across these areas (full list with parameters in docs/tools.md):
Area | What you can do |
Connection | Authenticate with congregation sharing, including emailed device verification; authenticate the NWP app bridge; value-free status. |
Data access | Sync 51 entity types into an owner-only local mirror; list, filter, get and describe entities with friendly field names; secrets redacted. |
Changes | Create, update or delete any entity with permission checks and stale-data detection. |
NWP app | Publish pending changes to the NWP app, optionally with NWS Desktop's targeted push notifications; import pending app submissions (reports, contact updates, requests, attendance, new addresses). |
Scheduling | Duty auto-assignment with the desktop algorithm; manual assignments and field-service schedules through the generic change tools. |
Public witnessing | Repeat templates over 1-8 weeks; assign shift positions; administer locations, shifts and templates; import reservations made in the NWP app; utilization and per-publisher reports. |
Files | Redacted JSON/CSV export; NWS Desktop-compatible |
Attachments | List, download, upload and remove information-board attachments and territory maps. |
Print layouts | Catalog of all 90 desktop reports with view access; structured data for S-13 territory assignment records and territory cards. |
Public-speaker sharing | List and connect to circuits; request to join, approve, deny, leave; receive congregations, speakers and outlines. |
Capabilities |
|
Safety model
Summary (details in docs/safety.md):
Preview, confirmation ID, commit. Every write is a preview that returns a ten-minute, single-use confirmation ID. The commit re-checks that nothing changed since the preview and refuses stale data. A cancel tool discards the preview.
No implicit publish or notify. Committing a change never publishes to the NWP app and never sends notifications. Publishing is its own preview/commit step, and
send_notificationsmust be passed explicitly astrueorfalse.Permissions enforced. The authenticated person's NWS access rights are applied as in NWS Desktop; edit, restore, publish and report-view rights are checked before writing or returning data.
Destructive restores additionally require
overwrite_existing_data=trueon both preview and commit.Secrets stay local. Credentials come only from your environment; tool output never contains passwords, PINs or tokens; local files are owner-only.
Requirements
Python 3.11 or newer.
An NWS congregation-sharing account (congregation ID, congregation password, and the email address of your NWS user). Write operations only work as far as your NWS access rights allow.
A vendor configuration file for NWS (see Configuration).
Install
python -m venv .venv
. .venv/bin/activate
python -m pip install .This installs the nws-mcp command, a stdio MCP server.
Configuration
The server is configured only through environment variables, normally set in your MCP client's server entry.
Variable | Required | Meaning |
| yes | Your NWS congregation ID ( |
| yes | The congregation-sharing password. |
| yes | The email address of your NWS user. Device verification codes are sent here. |
| yes | Path to the NWS vendor configuration file (JSON). |
| for NWP app tools | The congregation PIN used by the NWP app. Spaces, dashes and underscores are ignored. |
| no | Reserved; currently unused. |
| no | Where the local mirror, tokens and pending confirmations are stored. Default: |
Vendor configuration file. The server needs a vendor configuration file
for the NWS backend, given by NWS_VENDOR_CONFIG_PATH. That file is not
distributed with this project and this project does not explain how to obtain
it. Without it, the server cannot connect.
Keep all of these values, the vendor configuration file and the state directory out of version control. The state directory holds decrypted congregation data with owner-only permissions.
The server currently targets one NWS sharing region and one NWP app server (region ID 15, app server ID 5). Other regions are not configurable yet.
MCP client setup
Claude Code
claude mcp add nws \
-e NWS_CONGREGATION_ID=123-456-789 \
-e NWS_CONGREGATION_PASSWORD='your-password' \
-e NWS_EMAIL=you@example.org \
-e NWS_CONGREGATION_PIN='your-app-pin' \
-e NWS_VENDOR_CONFIG_PATH=/path/to/vendor-config.json \
-- /path/to/.venv/bin/nws-mcpOr in a project .mcp.json (do not commit real credentials):
{
"mcpServers": {
"nws": {
"command": "/path/to/.venv/bin/nws-mcp",
"env": {
"NWS_CONGREGATION_ID": "123-456-789",
"NWS_CONGREGATION_PASSWORD": "your-password",
"NWS_EMAIL": "you@example.org",
"NWS_CONGREGATION_PIN": "your-app-pin",
"NWS_VENDOR_CONFIG_PATH": "/path/to/vendor-config.json"
}
}
}
}Claude Desktop
Add the same entry to claude_desktop_config.json (Settings, Developer,
Edit Config):
{
"mcpServers": {
"nws": {
"command": "/path/to/.venv/bin/nws-mcp",
"env": {
"NWS_CONGREGATION_ID": "123-456-789",
"NWS_CONGREGATION_PASSWORD": "your-password",
"NWS_EMAIL": "you@example.org",
"NWS_CONGREGATION_PIN": "your-app-pin",
"NWS_VENDOR_CONFIG_PATH": "/path/to/vendor-config.json",
"NWS_STATE_DIR": "/path/to/private/nws-state"
}
}
}
}On Windows use paths such as C:\\Users\\you\\nws\\.venv\\Scripts\\nws-mcp.exe.
First steps
nws_statusto check that the configuration loads.nws_authenticate. On a new device NWS emails a verification code; pass it tonws_verify.nws_syncto fill the local mirror, thennws_entity_types,nws_listandnws_getto read.To change something:
nws_preview_change, review, thennws_commit_changewith the confirmation ID.To release changes to the NWP app:
nws_app_authenticate,nws_app_preview_publish, review, thennws_app_commit_publishwithsend_notificationsset totrueorfalse.
Development
python -m venv .venv
. .venv/bin/activate
python -m pip install -e '.[test]'
python -m pytestThe test suite runs fully offline: protocol tests use in-memory HTTP transports and never contact NWS.
Layout:
src/nws_mcp/server.py: MCP tool definitions.src/nws_mcp/protocol.py: authentication, Firestore and cloud-function client.src/nws_mcp/schema.pyandsrc/nws_mcp/data/schema.json: wire-name to friendly-name mappings and NWP field allow-lists.other modules: one per subsystem (publish, import, backup, attachments, print layouts, public witnessing, public-speaker sharing, auto-assignment).
Documentation
docs/tools.md: every tool, its parameters and behaviour.
docs/safety.md: the safety model.
docs/capabilities.md: the capability matrix, including unsupported and UI-only items.
docs/design/: design notes.
License
MIT. Copyright 2026 DezinerDudes.
"New World Scheduler", "NWS" and "NW Publisher" are names of their respective owners and are used here only to describe compatibility.
Available Tools
62 toolsnws_app_authenticateB
Authenticate the NWP app bridge against the configured NWP app server.
Inputs: no named parameters. Returns: object
nws_app_cancel_importA
Cancel one pending NWP import confirmation without remote changes.
Inputs: confirmation_id (required). Returns: object
nws_app_cancel_publishA
Cancel one pending NWP publish confirmation without remote changes.
Inputs: confirmation_id (required). Returns: object
nws_app_commit_importB
Import previewed NWP app submissions and remove them from the app queue.
Inputs: confirmation_id (required). Returns: object
nws_app_commit_publishC
Publish a previewed NWP release and explicitly send or skip notifications.
Inputs: confirmation_id (required), send_notifications (required). Returns: object
nws_app_preview_importC
Preview importing pending NWP app submissions into NWS congregation data.
Inputs: ui_text, data_types. Returns: object
nws_app_preview_publishB
Preview an NWP publish, then ask whether notifications should be sent.
Inputs: entity_types. Returns: object
nws_app_statusB
Return a value-free summary of the NWP app bridge and pending imports.
Inputs: no named parameters. Returns: object
nws_authenticateC
Authenticate NWS or initiate the emailed device-verification flow.
Inputs: no named parameters. Returns: object
nws_backup_createC
Write a read-only, vendor-compatible .NWSchedulerBackup of the shared data.
Inputs: output_path (required), sync_first. Returns: object
nws_backup_inspectB
Describe a vendor backup's contents and restorable categories by count only.
Inputs: backup_path (required). Returns: object
nws_cancel_attachment_changeB
Cancel a pending attachment upload or removal without remote changes.
Inputs: confirmation_id (required). Returns: object
nws_cancel_changeB
Cancel a pending NWS change preview without writing remote data.
Inputs: confirmation_id (required). Returns: object
nws_cancel_duty_auto_assignA
Cancel a pending duty auto-assignment preview without remote changes.
Inputs: confirmation_id (required). Returns: object
nws_capabilitiesB
Describe implemented MCP coverage across NWS Desktop subsystems.
Inputs: no named parameters. Returns: object
nws_commit_attachment_removalB
Remove a previewed attachment if remote data is unchanged.
Inputs: confirmation_id (required). Returns: object
nws_commit_attachment_uploadB
Upload a previewed attachment and record it if remote data is unchanged.
Inputs: confirmation_id (required). Returns: object
nws_commit_changeB
Commit one previously previewed NWS change if remote data is unchanged.
Inputs: confirmation_id (required). Returns: object
nws_commit_duty_auto_assignB
Write a previewed duty auto-assignment if its input data is unchanged.
Inputs: confirmation_id (required). Returns: object
nws_describe_entityB
Describe an entity type's friendly field names and observed value types.
Inputs: entity_type (required). Returns: object
nws_download_attachmentC
Download one entity's attachment to an owner-only local file.
Inputs: identity (required), entity_type (required), output_path (required), sync_first. Returns: object
nws_entity_typesB
List supported NWS entity types and their locally cached counts.
Inputs: no named parameters. Returns: object
nws_exportC
Export redacted NWS entities to an owner-only JSON or CSV file.
Inputs: output_path (required), sync_first, entity_types, output_format. Returns: object
nws_getC
Get one redacted cached NWS entity by ID or UUID.
Inputs: identity (required), entity_type (required). Returns: object
nws_listC
List redacted cached NWS entities with optional text filtering.
Inputs: entity_type (required), limit, query, offset. Returns: object
nws_list_attachmentsC
List cached announcement, document, and territory-map attachments.
Inputs: sync_first, entity_types. Returns: object
nws_preview_attachment_removalB
Preview permanently removing an attachment or territory map.
Inputs: identity (required), entity_type (required). Returns: object
nws_preview_attachment_uploadC
Preview adding a PDF, JPG, or PNG attachment or territory map.
Inputs: identity (required), file_path (required), entity_type (required). Returns: object
nws_preview_changeB
Preview a create, update, or delete and return a 10-minute confirmation ID.
Inputs: identity (required), operation (required), entity_type (required), values. Returns: object
nws_preview_duty_auto_assignA
Preview the desktop duty auto-assignment and return a confirmation ID.
start_date is a duties schedule row (a Monday, or a Saturday when duties are assigned by meeting). duty_types are Duty1P1 ... Duty9P2 (default Duty1P1). recent_filter is exact_match or any_duty; the last two arguments mirror the local desktop settings and default to the desktop defaults.
Inputs: start_date (required), weeks, duty_types, recent_filter, +2 more. Returns: object
nws_print_layoutC
Build the data of a supported desktop print layout, optionally to a file.
TerritoryAssignmentRecords (S-13) options: service_years (required list), territory_type, category_id, area_id, use_actual_last_completed_date, name_format. TerritoryCards options: territory_ids, include_notes_1, include_notes_2, include_addresses, address_status, show_address_status, show_address_notes, show_city_suburb, show_postal_code, show_state_province, show_name, show_phone.
Inputs: report_type (required), options, sync_first, output_path, +1 more. Returns: object
nws_print_layoutsB
List desktop print layouts, their support level, and the person's access.
Inputs: no named parameters. Returns: object
nws_public_speaker_cancel_changeB
Cancel a pending public-speaker change preview without remote changes.
Inputs: confirmation_id (required). Returns: object
nws_public_speaker_circuitsB
List public-speaker sharing circuits associated with this congregation.
Inputs: no named parameters. Returns: object
nws_public_speaker_commit_changeA
Commit one previewed public-speaker change if nothing changed since.
Inputs: confirmation_id (required). Returns: object
nws_public_speaker_congregationsB
List public congregations in an approved public-speaker circuit.
Inputs: circuit_id (required). Returns: object
nws_public_speaker_connectC
Connect read-only to one public-speaker sharing circuit.
Inputs: circuit_id (required). Returns: object
nws_public_speaker_preview_changeB
Preview a public-speaker circuit change and return a 10-minute confirmation ID.
Actions: request_join (circuit_type primary or guest), approve_congregation and deny_congregation (congregation_id), leave_circuit (optional remotely_delete_data for the approved primary circuit), and sync_congregations_and_speakers (receive shared congregations, speakers and their outlines into the local NWS data).
Inputs: action (required), circuit_id (required), circuit_type, congregation_id, +1 more. Returns: object
nws_public_witnessing_cancel_admin_changeB
Cancel a pending public witnessing administration preview without writing.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_cancel_app_reservation_importB
Cancel a pending NWP app reservation import without writing.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_cancel_assignmentB
Cancel a pending shift-assignment preview without writing remote data.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_cancel_repeat_templateC
Cancel a pending public witnessing template repeat without writing.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_candidatesC
List people the desktop offers for one public-witnessing shift position.
Inputs: date (required), position (required), shift_id (required). Returns: object
nws_public_witnessing_commit_admin_changeB
Commit a previewed public witnessing location, shift, or template change.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_commit_app_reservation_importB
Commit a previewed NWP app reservation import if nothing changed since.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_commit_assignmentB
Commit one previewed shift assignment if NWS data is unchanged.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_commit_repeat_templateC
Commit a previewed public witnessing template repeat.
Inputs: confirmation_id (required). Returns: object
nws_public_witnessing_locations_utilizationA
Report public-witnessing shift capacity and reservations per location.
Matches the desktop Locations Utilization report: the given YYYY-MM month (default: current) and the three previous months, from the local mirror.
Inputs: month. Returns: object
nws_public_witnessing_preview_app_reservation_importA
Preview importing reservations made in the NWP app into NWS data.
Inputs: no named parameters. Returns: object
nws_public_witnessing_preview_assignmentC
Preview assigning (person_id) or clearing (0) one shift position.
Inputs: date (required), position (required), shift_id (required), person_id. Returns: object
nws_public_witnessing_preview_location_changeB
Preview creating, updating, deleting, or disabling a public witnessing location.
operation is create, update, delete, disable_date, or enable_date. values may set LocationID (an active FieldServiceLocation ID, or -1 for the Kingdom Hall), CartNumber, AvailableFrom, AvailableTo (YYYY-MM-DD), and Notes. Deleting a location or disabling a date also deletes the affected reservations, exactly as NWS Desktop does.
Inputs: operation (required), date, values, location_id. Returns: object
nws_public_witnessing_preview_repeat_templateC
Preview repeating a public witnessing template for one to eight weeks.
Inputs: weeks (required), start_week (required), location_id, template_id. Returns: object
nws_public_witnessing_preview_shift_changeA
Preview adding, editing, duplicating, copying, or removing location shifts.
operation is create, update, duplicate, delete, delete_all, or copy_from_location. values may set DayOfWeek (0 Sunday to 6 Saturday), StartTime and EndTime (HH:MM, or null), MaxPersons, and KeyPersons (0-7). Removing a shift also deletes all of its reservations.
Inputs: operation (required), location_id (required), values, shift_id, +1 more. Returns: object
nws_public_witnessing_preview_template_changeA
Preview saving one week as a public witnessing template or deleting one.
operation is save_week (name plus a Monday week_start; a template with the same name is replaced) or delete (template_id).
Inputs: operation (required), name, week_start, template_id. Returns: object
nws_public_witnessing_publishers_reservationsB
Report public-witnessing reservations per publisher and month.
Matches the desktop Publishers Reservations report for the given YYYY-MM month (default: current) and the three previous months. Without person_ids every non-deleted person who has not moved is included.
Inputs: month, person_ids, name_format. Returns: object
nws_public_witnessing_scheduleB
Show cached public-witnessing locations, shifts, and positions for a date.
Inputs: date (required). Returns: object
nws_restore_cancelB
Cancel a pending backup restore preview without writing remote data.
Inputs: confirmation_id (required). Returns: object
nws_restore_commitB
Commit a previewed backup restore if the backup and remote data are unchanged.
Inputs: confirmation_id (required), overwrite_existing_data. Returns: object
nws_restore_previewA
Preview a destructive backup restore and return a 10-minute confirmation ID.
The optional selections match the desktop's partial restore choices and need exactly one matching category: attendance_month (YYYY-MM) for MeetingAttendanceRecords, report_year and/or report_month for PublisherReports, person_ids for Persons, and territory_ids for Territories, TerritoryAddresses or TerritoryAssignmentRecords.
Inputs: categories (required), backup_path (required), person_ids, report_year, +4 more. Returns: object
nws_statusA
Return value-free NWS configuration, authentication, and mirror status.
Inputs: no named parameters. Returns: object
nws_syncC
Refresh all or selected NWS entity types into the secure local mirror.
Inputs: entity_types. Returns: object
nws_verifyB
Finish NWS authentication with the verification code received by email.
Inputs: code (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 62 tools
The preview/commit/cancel triplet pattern gives each workflow family a recognizable shape, but several boundaries are unclear: the generic nws_preview_change / nws_commit_change versus the specialized nws_public_witnessing_preview_location_change, preview_shift_change, and preview_template_change, and the app-import pair nws_app_preview_import vs nws_public_witnessing_preview_app_reservation_import. Similarly nws_preview_attachment_upload overlaps conceptually with attaching files through the generic entity change tool, and the commit for location/shift/template changes is only reachable via the oddly broad nws_public_witnessing_commit_admin_change.
A consistent verb_noun style (nws_preview_change, nws_commit_attachment_upload) coexists with a domain-first style (nws_public_witnessing_*, nws_app_*, nws_restore_*) and bare verbs (nws_sync, nws_verify, nws_capabilities), so the prefix ordering is mixed. There is also local asymmetry: previews are preview_location_change / preview_shift_change / preview_template_change but the matching write is commit_admin_change, and attachment cancel is nws_cancel_attachment_change while preview/commit use upload/removal.
62 tools is heavy even for a full desktop application surface, largely because almost every workflow is expanded into three explicit preview/commit/cancel tools. Much of the surface looks consolidatable behind the existing generic change/restore/assignment patterns, making the set hard to survey and easy to misuse.
Coverage is broad and life-cycle-aware: auth, status, sync, generic entity CRUD with preview/commit, attachments, backups, destructive restore, exports, print layouts, reports, public-witnessing scheduling/reservations, public speakers, and duty auto-assignment. Minor gaps remain around specialized writes that only the generic change tool can reach, and some read/report paths lack a corresponding direct write counterpart.
Maintenance
Related MCP Connectors
The official Planning Center MCP server for interacting with your ministry's data.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Read and write shared BitsWeave context, projects, tasks, and work sessions through MCP.
Headless task management for bots, apps and AI agents. Remote MCP server, OAuth or access token.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients like Claude Desktop, Kilo, and Cursor to read and write Apollo's local-first personal agent data, including goals, practices, tasks, check-ins, and memory, with approval-gated mutations via stdio.MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to safely manage a real Anki collection without Anki Desktop or AnkiConnect while synchronizing with AnkiWeb or a self-hosted sync server. Supports decks, notes, cards, tags, note types, templates, media, scheduling, review history, analytics, backups, and full-sync recovery with serialized, idempotent, and optionally destructive operations.MIT
- AlicenseBqualityBmaintenanceEnables MCP clients to read account status, plans, and recent workouts, search official exercise names, and, when writes are enabled, apply confirmed preview-first plan changes and historical workout logs.22MIT
- AlicenseBqualityBmaintenanceEnables MCP clients such as Claude to read and manage persons, groups, calendars, events, and any of the 800+ ChurchTools API endpoints in a connected church instance using natural language. Reads execute immediately, while every write returns a preview of the intended change for approval before anything is committed, with one-time expiring tokens and a check for concurrent modifications.3313 npm1MIT