Skip to main content
Glama

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 .NWSchedulerBackup backups; inspect and restore backups, including partial restores.

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

nws_capabilities returns a machine-readable matrix of what is supported, guarded or UI-only. See docs/capabilities.md.

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_notifications must be passed explicitly as true or false.

  • 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=true on 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

NWS_CONGREGATION_ID

yes

Your NWS congregation ID (123-456-789 or nine digits).

NWS_CONGREGATION_PASSWORD

yes

The congregation-sharing password.

NWS_EMAIL

yes

The email address of your NWS user. Device verification codes are sent here.

NWS_VENDOR_CONFIG_PATH

yes

Path to the NWS vendor configuration file (JSON).

NWS_CONGREGATION_PIN

for NWP app tools

The congregation PIN used by the NWP app. Spaces, dashes and underscores are ignored.

NWS_PERSON_PIN

no

Reserved; currently unused.

NWS_STATE_DIR

no

Where the local mirror, tokens and pending confirmations are stored. Default: ~/.local/share/nws-mcp.

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-mcp

Or 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

  1. nws_status to check that the configuration loads.

  2. nws_authenticate. On a new device NWS emails a verification code; pass it to nws_verify.

  3. nws_sync to fill the local mirror, then nws_entity_types, nws_list and nws_get to read.

  4. To change something: nws_preview_change, review, then nws_commit_change with the confirmation ID.

  5. To release changes to the NWP app: nws_app_authenticate, nws_app_preview_publish, review, then nws_app_commit_publish with send_notifications set to true or false.

Development

python -m venv .venv
. .venv/bin/activate
python -m pip install -e '.[test]'
python -m pytest

The 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.py and src/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

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 tools
nws_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

    C2.9/5.0

    Scored across 62 tools

    Disambiguation3/5

    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.

    Naming Consistency3/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables 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
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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
    • A
      license
      B
      quality
      B
      maintenance
      Enables 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.
      22
      MIT
    • A
      license
      B
      quality
      B
      maintenance
      Enables 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.
      33
      13 npm
      1
      MIT