Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
2bb955e
docs(005-servant-oauth-extraction): add specification and design docs
albertov Dec 19, 2025
3b3174e
docs(005-servant-oauth-extraction): reorganize implementation plan wi…
albertov Dec 19, 2025
f784f01
fix(oauth): use OAuthErrorCode ADT in error responses
albertov Dec 19, 2025
627d7ad
build(oauth): register Errors module and tests
albertov Dec 19, 2025
2aa35f1
feat(oauth): add RFC 8414/9728 metadata types
albertov Dec 19, 2025
a61e6c2
fix(oauth): enforce smart constructor hygiene for metadata types
albertov Dec 19, 2025
f9ab404
test(oauth): add validation tests for ProtectedResourceMetadata
albertov Dec 19, 2025
1b722bd
chore: close bead mcp-5wk.26 and update gitignore
albertov Dec 19, 2025
34bf350
feat(oauth): add PKCE module with RFC 7636 implementation
albertov Dec 19, 2025
cfa4fef
fix(oauth): enforce smart constructor hygiene for PKCE types
albertov Dec 19, 2025
30f1e03
fix(oauth): enforce smart constructor hygiene for PKCE types
albertov Dec 19, 2025
48bbd77
test(oauth): add failing tests for OAuthGrantType in Types module
albertov Dec 19, 2025
9b25d15
refactor(oauth): move OAuthGrantType to Servant.OAuth2.IDP.Types
albertov Dec 19, 2025
4d61c48
test(auth): add failing tests for MCPOAuthConfig record type
albertov Dec 19, 2025
224abd2
feat(auth): implement MCPOAuthConfig record type
albertov Dec 19, 2025
1486fc3
chore(beads): close mcp-5wk.43 - MCPOAuthConfig implemented
albertov Dec 19, 2025
99c7f66
refactor: migrate LoginFlowError imports to Errors module
albertov Dec 19, 2025
a39d177
chore(beads): close mcp-5wk.28, mcp-5wk.49, mcp-5wk.51
albertov Dec 19, 2025
2c87b6b
docs(spec): clarify OAuthConfig removal strategy (R-005)
albertov Dec 19, 2025
92dd553
chore(beads): add Phase E tasks for OAuthConfig removal (R-005)
albertov Dec 19, 2025
84200fd
chore(beads): update mcp-5wk.29 description - unblocked
albertov Dec 19, 2025
63434b6
feat(oauth): add LoginAction and TokenValidity types (FR-004c)
albertov Dec 19, 2025
9fd1566
feat(oauth): add OAuthTrace module for structured tracing (FR-005)
albertov Dec 19, 2025
7de981f
feat(oauth): add OAuthEnv config record (FR-004)
albertov Dec 19, 2025
e9c2a76
chore(beads): close mcp-5wk.25 - OAuthEnv config module complete
albertov Dec 19, 2025
96817f6
chore(oauth): remove LoginFlowError from cabal exposed-modules
albertov Dec 19, 2025
725434b
refactor(oauth): use domain types as OAuthState map keys
albertov Dec 19, 2025
49768ec
refactor(oauth): replace MCP.Server.Time import with Control.Monad.Time
albertov Dec 19, 2025
d5da482
docs(spec): add Phase F type precision refinements
albertov Dec 19, 2025
23a5a45
refactor(oauth): replace MCP imports with Servant.OAuth2.IDP in Autho…
albertov Dec 19, 2025
492a718
refactor(oauth): enforce Username smart constructor hygiene
albertov Dec 19, 2025
a15f30d
docs(spec): document OAuthTrace extraction and renderOAuthTrace place…
albertov Dec 19, 2025
018bb4e
chore(beads): close duplicate tasks from old numbering scheme
albertov Dec 19, 2025
6645bfc
refactor(oauth): enforce smart constructor hygiene in Types.hs
albertov Dec 19, 2025
9591726
refactor(oauth): replace MCP imports with Servant.OAuth2.IDP in handlers
albertov Dec 19, 2025
7f07c82
test: add failing tests for AuthorizationError ADT payloads (Phase F.…
albertov Dec 19, 2025
4f3a7e7
refactor(oauth): replace Text with ADT payloads in AuthorizationError…
albertov Dec 19, 2025
88b04f6
refactor(oauth): eliminate Map Text Text anti-pattern in token handle…
albertov Dec 19, 2025
3a3fa29
chore(beads): close mcp-5wk.65, add MalformedReason tech debt bead
albertov Dec 19, 2025
a910496
refactor(oauth): complete OAuthTrace extraction to Servant.OAuth2.IDP
albertov Dec 19, 2025
dc33043
chore: close mcp-5wk.70, adjust hooks and linting rules
albertov Dec 19, 2025
13af19a
chore: fix all hlint warnings systematically
albertov Dec 19, 2025
858b69c
chore(beads): close mcp-xpt, all hlint warnings fixed
albertov Dec 19, 2025
01e4792
test: add failing tests for MCPOAuthConfig unprefixed fields
albertov Dec 19, 2025
7802444
refactor(oauth): replace OAuthConfig with MCPOAuthConfig and DemoOAut…
albertov Dec 19, 2025
38a00d7
refactor(oauth): simplify DemoOAuthBundle to compose existing types
albertov Dec 19, 2025
db5b67e
refactor(oauth): update tests and docs for new OAuth types
albertov Dec 19, 2025
4bbc888
test(oauth): re-enable 22 ErrorBoundarySecuritySpec tests
albertov Dec 19, 2025
74d16cb
docs(005-oauth-extraction): add resource server config and clarificat…
albertov Dec 19, 2025
75e7185
test(oauth): add failing test for OAuthEnv resource server fields
albertov Dec 19, 2025
3f84067
feat(oauth): add resource server fields to OAuthEnv
albertov Dec 19, 2025
f6827b3
test(metadata): add failing test for OAuthEnv-only handleMetadata
albertov Dec 19, 2025
e632287
refactor(metadata): complete MCP namespace cleanup in handlers
albertov Dec 19, 2025
cb27420
feat(oauth): add configurable branding fields to OAuthEnv
albertov Dec 19, 2025
fb169f8
feat(oauth): connect envOAuthTracer to HTTPTrace via contramap
albertov Dec 19, 2025
a3a8565
refactor(oauth): remove MCP namespace references from IDP modules
albertov Dec 19, 2025
49b59ed
refactor(oauth): update handler tracer constraints to OAuthTrace
albertov Dec 20, 2025
6bdf5aa
refactor(oauth): parameterize HTML branding in login/error pages
albertov Dec 20, 2025
2399a3d
refactor(oauth): wire configurable branding to LoginPage and ErrorPage
albertov Dec 20, 2025
d238bca
chore(beads): close mcp-e7z HTML branding config task
albertov Dec 20, 2025
744b103
feat(oauth): add MCP-specific scope descriptions to OAuth config
albertov Dec 20, 2025
c6fb919
chore(beads): close mcp-h6y MCP branding config task
albertov Dec 20, 2025
603b986
test(oauth): update InvalidRequest test for MalformedReason ADT
albertov Dec 20, 2025
28ef18e
refactor(oauth): add MalformedReason ADT for structured error context
albertov Dec 20, 2025
5447a4e
Clarify specs. Plan to fix gaps in implementation
albertov Dec 20, 2025
f567404
fix(oauth): use constant-time comparison for PKCE validation
albertov Dec 20, 2025
520f14f
chore(beads): close mcp-5wk.89 PKCE timing attack fix
albertov Dec 20, 2025
dfbc9d8
refactor(oauth): remove duplicate LoginFlowError module
albertov Dec 20, 2025
cb76c15
refactor(oauth): use domain types for generator return values
albertov Dec 20, 2025
4117fa1
chore(beads): close mcp-5wk.88 domain type generators
albertov Dec 20, 2025
8666caa
refactor(oauth): remove unsafeCoerce by moving unsafe constructors to…
albertov Dec 20, 2025
011dd6c
chore(beads): close mcp-5wk.90 remove unsafeCoerce
albertov Dec 20, 2025
4087f42
docs(oauth): update Boundary.hs usage comments after Internal.hs removal
albertov Dec 20, 2025
128d67c
refactor(oauth): use TypeApplications to fix redundant OAuthStateStor…
albertov Dec 20, 2025
ebe6dca
test: add HelpersSpec for generator return types
albertov Dec 20, 2025
a8ccc28
fix(errors): remove authorization code IDs from client-facing error m…
albertov Dec 20, 2025
a81eb71
refactor: consolidate duplicate module imports
albertov Dec 20, 2025
7302e8b
fix: consolidate imports and remove unused pragmas per HLint
albertov Dec 20, 2025
9ebfdf8
docs(oauth): update CLAUDE.md for Servant.OAuth2.IDP extraction
albertov Dec 20, 2025
cb7e24f
chore(beads): close epic mcp-5wk - Servant OAuth extraction complete
albertov Dec 20, 2025
9f1358c
docs: remove temporal language from comments and documentation
albertov Dec 20, 2025
5b89763
refactor: improve formatting and use safe UserId construction
albertov Dec 22, 2025
b7aff52
docs: clarify smart constructor hygiene for Servant.OAuth2.IDP extrac…
albertov Dec 22, 2025
ad937a2
refactor(oauth): replace unsafe* with smart constructors in productio…
albertov Dec 22, 2025
9e0a27a
chore(beads): close mcp-5wk.96.9 - production files use smart constru…
albertov Dec 22, 2025
44c81a7
chore(beads): close mcp-5wk.96.8 - MCP.Trace.OAuth deletion verified
albertov Dec 22, 2025
3b10fdf
refactor(oauth-types): remove all unsafe* exports from Types.hs
albertov Dec 22, 2025
af066cb
update specs
albertov Dec 22, 2025
df7de33
refactor(oauth): delete Boundary module, move to MCP modules
albertov Dec 22, 2025
1c318f1
feat(oauth-types): add crypto-random ID generators
albertov Dec 22, 2025
6db95e5
chore(beads): close mcp-5wk.96.10 - crypto-random generators
albertov Dec 22, 2025
2bca591
beads
albertov Dec 22, 2025
6e30dea
refactor(test): replace unsafeRedirectUri with mkRedirectUri smart co…
albertov Dec 22, 2025
a134340
Update CLAUDE.md
albertov Dec 22, 2025
31c2ae1
refactor(test): replace unsafe constructors with smart constructors
albertov Dec 22, 2025
f44bd97
chore(deps): add QuickCheck to library dependencies
albertov Dec 22, 2025
6c8ec8d
refactor(test): move Arbitrary instances to type-defining modules
albertov Dec 22, 2025
d42b2e6
refactor(test): eliminate orphan UTCTime instance with monomorphic he…
albertov Dec 22, 2025
6fc6167
beads
albertov Dec 22, 2025
357378b
remove -Wno-orhans
albertov Dec 22, 2025
e7a31fb
refactor(oauth-types): remove all unsafe* exports and definitions
albertov Dec 22, 2025
a90718d
refactor(oauth-handlers): delete Helpers.hs, redistribute functions
albertov Dec 22, 2025
905bc44
docs(plan): update plan.md to reflect 2025-12-22 cleanup changes
albertov Dec 22, 2025
0c8de08
chore(beads): close mcp-5wk.96 smart constructor hygiene cleanup
albertov Dec 22, 2025
17b7e37
beads & spec
albertov Dec 22, 2025
0ba551f
feat(oauth-errors): add OAuthError unified sum type
albertov Dec 22, 2025
7cd6d42
test(oauth-errors): add failing tests for oauthErrorToServerError
albertov Dec 22, 2025
1a87369
feat(oauth-errors): implement oauthErrorToServerError conversion
albertov Dec 22, 2025
b3aaabb
test(oauth-errors): add failing tests for appErrorToServerError
albertov Dec 22, 2025
aec3297
feat(oauth-errors): implement appErrorToServerError using oauthErrorT…
albertov Dec 22, 2025
e13f932
fix(app-env): use appErrorToServerError in runAppM instead of domainE…
albertov Dec 22, 2025
f58a511
test(oauth-errors): migrate tests to appErrorToServerError
albertov Dec 22, 2025
4b378c3
refactor(app-env): remove dead code domainErrorToServerError
albertov Dec 22, 2025
7381d85
beads & spec
albertov Dec 22, 2025
8501325
docs: update CLAUDE.md and README.md for OAuth extraction
albertov Dec 22, 2025
cc79868
fix(oauth): allow HTTP URLs for demo mode resource metadata
albertov Dec 22, 2025
fe6e977
fix(oauth): correct login button action value to "approve"
albertov Dec 22, 2025
0664327
fix(examples): thread baseUrl to OAuth bundle in http-server
albertov Dec 22, 2025
d43daac
beads
albertov Dec 22, 2025
212fd10
refactor(oauth): add type precision to ProtectedResourceMetadata
albertov Dec 22, 2025
7f84f24
fix(test): replace fromJust with unsafeParseURI helper
albertov Dec 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 122 additions & 24 deletions .beads/issues.jsonl

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .claude/hooks/check-haskell.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ if [[ ! "$file_path" == *.hs ]]; then
exit 0
fi

cd "$CLAUDE_PROJECT_DIR" || exit 1
cd "$CLAUDE_PROJECT_DIR" || exit 0

output=$(cabal build 2>&1)
result=$?
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,9 @@ core-reviews
cabal.project.freeze
code-reviews
*.log
.env*
.DS_Store
Thumbs.db
.vscode/
.idea/
*.tix
2 changes: 1 addition & 1 deletion .hlint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@
- package base
rules:

- warn: {lhs: unsafeCoerce, rhs: coerce, name: Avoid unsafeCoerce}
- error: {lhs: unsafeCoerce, rhs: coerce, name: Avoid unsafeCoerce}

# Data.Bifoldable

Expand Down
15 changes: 12 additions & 3 deletions .specify/memory/constitution.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
<!--
SYNC IMPACT REPORT
===================
Version: 1.0.0 (initial ratification)
Version: 1.0.2 (smart constructor hygiene)
Changes:
- Initial constitution creation from typed functional design skills
- 6 core principles distilled from: functional-domain-modeling, haskell-design,
- 6 core principles distilled from: typed-domain-modeling, haskell-design,
architecture-patterns, testing-strategies, code-review-standards, error-handling-strategies
- 1.0.1: Added domain-centric type naming convention (types denote what they ARE, not field names)
- 1.0.2: Added smart constructor export rule (MUST NOT export type constructors, use pattern synonyms for matching)
Added sections:
- Core Principles (6 principles)
- Development Standards
Expand Down Expand Up @@ -46,6 +48,10 @@ implementation complexity determines module quality.
- Public interfaces MUST be minimal—export only what users need
- Implementation details MUST be hidden through module exports and opaque types
- Smart constructors MUST be the only way to create validated domain types
- Type constructors for smart-constructor types MUST NOT be exported—not even for tests
- Export pattern: `module Foo (FooType, mkFooType, unFooType)` — never `FooType(..)`
- If pattern matching is needed, export pattern synonyms instead of raw constructors
- This allows proving correct construction by construction
- Common cases MUST be simple; rare cases MAY be harder
- Complexity MUST be pulled downward into implementations, not pushed to callers

Expand Down Expand Up @@ -125,6 +131,9 @@ provide a specification that tests verify.
- Smart constructors: mk prefix (mkEmail, mkUserId)
- Predicates: is/has prefix
- Conversions: to/from (emailToText, textToEmail)
- Type names MUST denote what they ARE (domain concept), not what field they populate:
- Good: `TokenValidity`, `ClientName` (describes the concept)
- Bad: `ExpiresIn`, `NameField` (mirrors field/wire format names)

### Error Handling

Expand Down Expand Up @@ -171,4 +180,4 @@ This constitution supersedes all other coding practices in this project. Amendme
- MINOR: New principle added or existing principle materially expanded
- PATCH: Clarifications, wording improvements, non-semantic changes

**Version**: 1.0.0 | **Ratified**: 2025-12-08 | **Last Amended**: 2025-12-08
**Version**: 1.0.2 | **Ratified**: 2025-12-08 | **Last Amended**: 2025-12-19
227 changes: 136 additions & 91 deletions CLAUDE.md

Large diffs are not rendered by default.

36 changes: 29 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,10 @@ main = do
, httpServerInfo = serverInfo
, httpCapabilities = capabilities
, httpEnableLogging = False
, httpOAuthConfig = Nothing -- No OAuth
, httpMCPOAuthConfig = Nothing -- No OAuth
, httpJWK = Nothing -- Auto-generated
, httpProtocolVersion = "2025-06-18" -- MCP protocol version
, httpProtectedResourceMetadata = Nothing
}
runServerHTTP config
```
Expand Down Expand Up @@ -247,10 +248,14 @@ runHTTP :: IO ()
runHTTP = do
let config = HTTPServerConfig
{ httpPort = 8080
, httpBaseUrl = "http://localhost:8080"
, httpServerInfo = Implementation "my-server" "1.0.0"
, httpCapabilities = serverCapabilities
, httpEnableLogging = False
, httpOAuthConfig = Nothing -- or Just oauthConfig for OAuth
, httpMCPOAuthConfig = Nothing -- or Just mcpOAuthConfig for OAuth
, httpJWK = Nothing
, httpProtocolVersion = "2025-06-18"
, httpProtectedResourceMetadata = Nothing
}
runServerHTTP config
```
Expand Down Expand Up @@ -310,15 +315,32 @@ src/
│ ├── Types.hs # Core MCP data types
│ ├── Protocol.hs # JSON-RPC protocol messages
│ ├── Server.hs # Core server infrastructure
│ └── Server/
│ ├── StdIO.hs # StdIO transport implementation
│ └── HTTP.hs # HTTP transport implementation
│ ├── Server/
│ │ ├── StdIO.hs # StdIO transport implementation
│ │ ├── HTTP.hs # HTTP transport implementation
│ │ ├── HTTP/
│ │ │ └── AppEnv.hs # Composite environment and error types
│ │ └── Auth.hs # MCP-specific OAuth configuration
│ └── Trace/
│ └── HTTP.hs # HTTP tracing types
├── Servant/
│ └── OAuth2/
│ └── IDP/ # Reusable OAuth 2.1 library (MCP-independent)
│ ├── Types.hs # Core domain newtypes
│ ├── Config.hs # OAuthEnv configuration
│ ├── Errors.hs # Error types and conversions
│ ├── PKCE.hs # RFC 7636 PKCE implementation
│ ├── Metadata.hs # RFC 8414/9728 metadata types
│ ├── Store.hs # OAuthStateStore typeclass
│ ├── Trace.hs # OAuthTrace ADT
│ ├── Server.hs # OAuth API composition
│ └── Handlers/ # OAuth endpoint handlers

app/
└── Main.hs # Example MCP server (StdIO mode)

test/
└── Main.hs # Test suite (placeholder)
examples/
└── http-server.hs # HTTP server example with OAuth
```

## Development
Expand Down
67 changes: 38 additions & 29 deletions examples/http-server.hs
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ import System.IO (hFlush, stdout)
import MCP.Protocol
import MCP.Server
import MCP.Server.Auth
import MCP.Server.HTTP
import MCP.Server.HTTP (DemoOAuthBundle (..), HTTPServerConfig (..), mcpAppWithOAuth, mkDemoOAuthBundleFromText, runServerHTTP)
import MCP.Server.HTTP.AppEnv (AppEnv (..), runAppM)
import MCP.Trace.HTTP (HTTPTrace (..))
import MCP.Trace.Types (MCPTrace (..), isOAuthTrace, renderMCPTrace)
import MCP.Types
import Servant.Auth.Server (defaultJWTSettings, generateKey)
Expand Down Expand Up @@ -204,37 +205,38 @@ main = do
}

let baseUrl = T.pack $ fromMaybe ("http://localhost:" ++ show optPort) optBaseUrl
oauthConfig =
mcpOAuthConfig =
if optEnableOAuth
then
Just $
defaultDemoOAuthConfig
{ oauthProviders =
[ OAuthProvider
{ providerName = "demo"
, clientId = "demo-client"
, clientSecret = Just "demo-secret"
, authorizationEndpoint = baseUrl <> "/authorize"
, tokenEndpoint = baseUrl <> "/token"
, userInfoEndpoint = Nothing
, scopes = ["mcp:read", "mcp:write"]
, grantTypes = [AuthorizationCode]
, requiresPKCE = True -- MCP requires PKCE
, metadataEndpoint = Nothing
}
]
, -- Override demo defaults for example
authCodeExpirySeconds = 600 -- 10 minutes
, accessTokenExpirySeconds = 3600 -- 1 hour
, demoUserIdTemplate = Just "demo-user-{clientId}"
, demoEmailDomain = "demo.example.com"
, demoUserName = "Demo User"
, authorizationSuccessTemplate =
Just $
let bundle = case mkDemoOAuthBundleFromText baseUrl of
Just b -> b
Nothing -> Prelude.error $ "Invalid base URL: " ++ T.unpack baseUrl
baseMCPConfig = bundleMCPConfig bundle
in Just $
baseMCPConfig
{ oauthProviders =
[ OAuthProvider
{ providerName = "demo"
, clientId = "demo-client"
, clientSecret = Just "demo-secret"
, authorizationEndpoint = baseUrl <> "/authorize"
, tokenEndpoint = baseUrl <> "/token"
, userInfoEndpoint = Nothing
, scopes = ["mcp:read", "mcp:write"]
, grantTypes = [OAuthAuthorizationCode]
, requiresPKCE = True -- MCP requires PKCE
, metadataEndpoint = Nothing
}
]
, -- Override demo defaults for example
demoUserIdTemplate = Just "demo-user-{clientId}"
, demoEmailDomain = "demo.example.com"
, demoUserName = "Demo User"
, authorizationSuccessTemplate =
"Demo Authorization Successful!\n\n"
<> "Redirect to: {redirectUri}?code={code}{state}\n\n"
<> "This is a demo server. In production, this would redirect automatically."
}
}
else Nothing

let config =
Expand All @@ -244,7 +246,7 @@ main = do
, httpServerInfo = serverInfo
, httpCapabilities = capabilities
, httpEnableLogging = optEnableLogging
, httpOAuthConfig = oauthConfig
, httpMCPOAuthConfig = mcpOAuthConfig
, httpJWK = Nothing -- Will be auto-generated
, httpProtocolVersion = mcpProtocolVersion -- Current MCP protocol version
, httpProtectedResourceMetadata = Nothing -- Will be auto-generated from baseUrl
Expand Down Expand Up @@ -312,12 +314,19 @@ main = do
stateVar <- newTVarIO $ initialServerState (httpCapabilities config)

-- Create AppEnv with configured settings (including stateVar)
let appEnv =
let bundle = case mkDemoOAuthBundleFromText baseUrl of
Just b -> b
Nothing -> Prelude.error $ "Invalid base URL: " ++ T.unpack baseUrl
oauthCfgEnv = bundleEnv bundle -- Use OAuthEnv from bundle
oauthTracer = contramap HTTPOAuth httpTracer -- Route OAuth traces through HTTP tracer
appEnv =
AppEnv
{ envOAuth = oauthEnv
, envAuth = authEnv
, envConfig = config
, envTracer = httpTracer
, envOAuthEnv = oauthCfgEnv
, envOAuthTracer = oauthTracer
, envJWT = jwtSettings
, envServerState = stateVar
, envTimeProvider = Nothing -- Use real IO time
Expand Down
26 changes: 18 additions & 8 deletions mcp.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -95,16 +95,18 @@ library
MCP.Server.Auth
MCP.Server.Time
Servant.OAuth2.IDP.API
Servant.OAuth2.IDP.Config
Servant.OAuth2.IDP.Types
Servant.OAuth2.IDP.Metadata
Servant.OAuth2.IDP.PKCE
Servant.OAuth2.IDP.Store
Servant.OAuth2.IDP.Store.InMemory
Servant.OAuth2.IDP.Boundary
Servant.OAuth2.IDP.Errors
Servant.OAuth2.IDP.Trace
Servant.OAuth2.IDP.Server
Servant.OAuth2.IDP.Handlers
Servant.OAuth2.IDP.Handlers.HTML
Servant.OAuth2.IDP.Handlers.Helpers
Servant.OAuth2.IDP.Handlers.Metadata
Servant.OAuth2.IDP.LoginFlowError
Servant.OAuth2.IDP.Handlers.Registration
Servant.OAuth2.IDP.Handlers.Authorization
Servant.OAuth2.IDP.Handlers.Login
Expand All @@ -114,14 +116,13 @@ library
Servant.OAuth2.IDP.Auth.Demo
MCP.Trace.Types
MCP.Trace.HTTP
MCP.Trace.OAuth
MCP.Trace.Operation
MCP.Trace.Protocol
MCP.Trace.Server
MCP.Trace.StdIO

-- Modules included in this library but not exported.
-- other-modules:
other-modules:

-- LANGUAGE extensions used by modules in this package.
-- other-extensions:
Expand Down Expand Up @@ -158,7 +159,8 @@ library
hspec >= 2.10 && < 2.12,
hspec-wai >= 0.11 && < 0.12,
lucid >= 2.11 && < 2.12,
servant-lucid >= 0.9 && < 0.10
servant-lucid >= 0.9 && < 0.10,
QuickCheck >= 2.14 && < 2.16

-- Directories containing source files.
hs-source-dirs: src
Expand Down Expand Up @@ -266,7 +268,6 @@ test-suite mcp-test

-- Modules included in this executable, other than Main.
other-modules:
Generators
TestMonad
Laws.AuthCodeFunctorSpec
Laws.ConsumeAuthCodeSpec
Expand All @@ -279,20 +280,29 @@ test-suite mcp-test
Laws.ErrorBoundarySecuritySpec
Trace.FilterSpec
Trace.GoldenSpec
Trace.OAuthSpec
Trace.RenderSpec
Functional.OAuthFlowSpec
MCP.Server.OAuth.Test.Fixtures
MCP.Server.OAuth.TypesSpec
MCP.Server.OAuth.BoundarySpec
MCP.Server.OAuth.AppSpec
MCP.Server.HTTP.AppEnvSpec
MCP.Server.HTTP.McpAuthSpec
MCP.Server.AuthSpec
Security.SessionCookieSpec
Servant.OAuth2.IDP.APISpec
Servant.OAuth2.IDP.BrandingSpec
Servant.OAuth2.IDP.ConfigSpec
Servant.OAuth2.IDP.TokenRequestSpec
Servant.OAuth2.IDP.LucidRenderingSpec
Servant.OAuth2.IDP.TypesSpec
Servant.OAuth2.IDP.CryptoEntropySpec
Servant.OAuth2.IDP.BearerMethodSpec
Servant.OAuth2.IDP.ErrorsSpec
Servant.OAuth2.IDP.Handlers.MetadataSpec
Servant.OAuth2.IDP.MetadataSpec
Servant.OAuth2.IDP.PKCESpec
Servant.OAuth2.IDP.TraceSpec

-- LANGUAGE extensions used by modules in this package.
-- other-extensions:
Expand Down
Loading