(_ *cobra.Command, _ []string)
| 77 | } |
| 78 | |
| 79 | func runMCP(_ *cobra.Command, _ []string) { |
| 80 | // MCP stdio mode: stderr-only logging so it doesn't interleave with the |
| 81 | // JSON-RPC framing on stdout. |
| 82 | log := zerolog.New(os.Stderr).With().Timestamp().Logger() |
| 83 | |
| 84 | // Wire all subsystems an MCP-exposed tool might need. As more ops |
| 85 | // migrate into internal/service, this list stays the same — the |
| 86 | // service-provider dependencies don't change per op, only the methods |
| 87 | // on the provider do. |
| 88 | storageProvider, err := storage.New(&rootArgs.config, &storage.Dependencies{Log: &log}) |
| 89 | if err != nil { |
| 90 | log.Fatal().Err(err).Msg("failed to create storage provider") |
| 91 | } |
| 92 | memoryStoreProvider, err := memory_store.New(&rootArgs.config, &memory_store.Dependencies{ |
| 93 | Log: &log, |
| 94 | StorageProvider: storageProvider, |
| 95 | }) |
| 96 | if err != nil { |
| 97 | log.Fatal().Err(err).Msg("failed to create memory store provider") |
| 98 | } |
| 99 | tokenProvider, err := token.New(&rootArgs.config, &token.Dependencies{ |
| 100 | Log: &log, |
| 101 | MemoryStoreProvider: memoryStoreProvider, |
| 102 | }) |
| 103 | if err != nil { |
| 104 | log.Fatal().Err(err).Msg("failed to create token provider") |
| 105 | } |
| 106 | emailProvider, err := email.New(&rootArgs.config, &email.Dependencies{ |
| 107 | Log: &log, |
| 108 | StorageProvider: storageProvider, |
| 109 | }) |
| 110 | if err != nil { |
| 111 | log.Fatal().Err(err).Msg("failed to create email provider") |
| 112 | } |
| 113 | smsProvider, err := sms.New(&rootArgs.config, &sms.Dependencies{Log: &log}) |
| 114 | if err != nil { |
| 115 | log.Fatal().Err(err).Msg("failed to create sms provider") |
| 116 | } |
| 117 | auditProvider := audit.New(&audit.Dependencies{ |
| 118 | Log: &log, |
| 119 | StorageProvider: storageProvider, |
| 120 | }) |
| 121 | eventsProvider, err := events.New(&rootArgs.config, &events.Dependencies{ |
| 122 | Log: &log, |
| 123 | StorageProvider: storageProvider, |
| 124 | }) |
| 125 | if err != nil { |
| 126 | log.Fatal().Err(err).Msg("failed to create events provider") |
| 127 | } |
| 128 | |
| 129 | // Embedded OpenFGA engine, shared init with root.go. Nil (fail-closed) |
| 130 | // when FGA is not configured or init fails — the permission tools fail |
| 131 | // closed while the rest of the MCP surface serves. |
| 132 | authzEngine, closeAuthzEngine := initAuthzEngine(&rootArgs.config, &log) |
| 133 | defer closeAuthzEngine() |
| 134 | |
| 135 | // Authenticator provider — required by the service layer's TOTP/MFA |
| 136 | // verification flows (verify_otp, login). |
nothing calls this directly
no test coverage detected