Skip to content

Commit e488a96

Browse files
refactor: rename resolve_config to get_mcp_config
Per user feedback, 'get' is more accurate since the value may already be resolved/cached, and 'mcp' in the name makes it clearer what we're doing. Changes: - Renamed public function resolve_config -> get_mcp_config - Renamed internal method MCPServerConfig.resolve_config -> get_config - Updated all test function names and calls - Updated module docstring examples - Updated README examples and API reference - Updated __init__.py exports Co-Authored-By: AJ Steers <aj@airbyte.io>
1 parent 3d8c4db commit e488a96

4 files changed

Lines changed: 43 additions & 42 deletions

File tree

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ app = mcp_server(
5252
)
5353

5454
# Server info resource is automatically registered at {name}://server/info
55-
# Resolve credentials from HTTP headers or environment variables
56-
from fastmcp_extensions import resolve_config
57-
api_key = resolve_config(app, "api_key")
55+
# Get credentials from HTTP headers or environment variables
56+
from fastmcp_extensions import get_mcp_config
57+
api_key = get_mcp_config(app, "api_key")
5858
```
5959

6060
### Using Annotation Constants
@@ -168,7 +168,7 @@ cmd = "python bin/measure_mcp_tool_list.py"
168168

169169
- `mcp_server` - Create a FastMCP instance with built-in server info resource
170170
- `MCPServerConfigArg` - Configuration for credential resolution
171-
- `resolve_config` - Resolve a credential from HTTP headers or environment variables
171+
- `get_mcp_config` - Get a credential from HTTP headers or environment variables
172172

173173
### Annotations
174174

src/fastmcp_extensions/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
from fastmcp_extensions.server import (
3737
MCPServerConfig,
3838
MCPServerConfigArg,
39+
get_mcp_config,
3940
mcp_server,
40-
resolve_config,
4141
)
4242

4343
__all__ = [
@@ -50,6 +50,7 @@
5050
"PromptDef",
5151
"ResourceDef",
5252
"clear_registrations",
53+
"get_mcp_config",
5354
"get_registered_prompts",
5455
"get_registered_resources",
5556
"get_registered_tools",
@@ -60,5 +61,4 @@
6061
"register_mcp_prompts",
6162
"register_mcp_resources",
6263
"register_mcp_tools",
63-
"resolve_config",
6464
]

src/fastmcp_extensions/server.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
- `mcp_server`: Factory function to create a FastMCP instance with built-in features
1111
- `MCPServerConfigArg`: Dataclass for defining credential resolution configuration
1212
- `MCPServerConfig`: Dataclass storing server configuration (attached to the app)
13-
- `resolve_config`: Helper function to resolve credentials at runtime
13+
- `get_mcp_config`: Helper function to get credentials at runtime
1414
1515
## Basic Usage
1616
@@ -30,7 +30,7 @@
3030
Define credentials that resolve from HTTP headers, environment variables, or defaults:
3131
3232
```py
33-
from fastmcp_extensions import mcp_server, MCPServerConfigArg, resolve_config
33+
from fastmcp_extensions import mcp_server, MCPServerConfigArg, get_mcp_config
3434
3535
app = mcp_server(
3636
name="my-server",
@@ -44,8 +44,8 @@
4444
],
4545
)
4646
47-
# Later, resolve the credential (checks header -> env var -> default)
48-
api_key = resolve_config(app, "api_key")
47+
# Later, get the credential (checks header -> env var -> default)
48+
api_key = get_mcp_config(app, "api_key")
4949
```
5050
5151
## MCP Module Auto-Discovery
@@ -128,15 +128,16 @@ def __post_init__(self) -> None:
128128
"""Build lookup dict for config args by name."""
129129
self._config_args_by_name = {arg.name: arg for arg in self.config_args}
130130

131-
def resolve_config(self, name: str) -> str:
132-
"""Resolve a configuration value by name.
131+
def get_config(self, name: str) -> str:
132+
"""Get a configuration value by name.
133133
134134
Resolution order:
135135
1. HTTP headers (case-insensitive)
136136
2. Environment variables
137+
3. Default value
137138
138139
Args:
139-
name: The name of the config argument to resolve.
140+
name: The name of the config argument to get.
140141
141142
Returns:
142143
The resolved value as a string.
@@ -442,10 +443,10 @@ def mcp_server(
442443
return app
443444

444445

445-
def resolve_config(ctx_or_app: Context | FastMCP, name: str) -> str:
446-
"""Resolve a configuration value from an MCP server.
446+
def get_mcp_config(ctx_or_app: Context | FastMCP, name: str) -> str:
447+
"""Get a configuration value from an MCP server.
447448
448-
This is a convenience function to resolve config values from a FastMCP
449+
This is a convenience function to get config values from a FastMCP
449450
app created with mcp_server(). It accepts either a Context object (preferred
450451
for use in MCP tools) or a FastMCP app instance directly.
451452
@@ -455,7 +456,7 @@ def resolve_config(ctx_or_app: Context | FastMCP, name: str) -> str:
455456
Args:
456457
ctx_or_app: Either a FastMCP Context object (from tool/resource functions)
457458
or a FastMCP application instance (created with mcp_server()).
458-
name: The name of the config argument to resolve.
459+
name: The name of the config argument to get.
459460
460461
Returns:
461462
The resolved value as a string.
@@ -469,12 +470,12 @@ def resolve_config(ctx_or_app: Context | FastMCP, name: str) -> str:
469470
```python
470471
@mcp_tool(...)
471472
def my_tool(ctx: Context, ...) -> str:
472-
api_key = resolve_config(ctx, "api_key")
473+
api_key = get_mcp_config(ctx, "api_key")
473474
...
474475
```
475476
"""
476477
# Extract the FastMCP app from Context if needed
477478
app = ctx_or_app.fastmcp if isinstance(ctx_or_app, Context) else ctx_or_app
478479

479480
config: MCPServerConfig = app.x_mcp_server_config # type: ignore[attr-defined]
480-
return config.resolve_config(name)
481+
return config.get_config(name)

tests/test_server.py

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
from fastmcp_extensions import (
1111
MCPServerConfig,
1212
MCPServerConfigArg,
13+
get_mcp_config,
1314
mcp_server,
14-
resolve_config,
1515
)
1616

1717

@@ -112,7 +112,7 @@ def test_mcp_server_config_arg_attributes(
112112

113113

114114
@pytest.mark.unit
115-
def test_resolve_config_from_env_var() -> None:
115+
def test_get_mcp_config_from_env_var() -> None:
116116
"""Test resolving config from environment variable."""
117117
config_args = [
118118
MCPServerConfigArg(
@@ -125,12 +125,12 @@ def test_resolve_config_from_env_var() -> None:
125125
app = mcp_server("test-server", server_config_args=config_args)
126126

127127
with patch.dict(os.environ, {"TEST_API_KEY": "secret-key-123"}):
128-
value = resolve_config(app, "api_key")
128+
value = get_mcp_config(app, "api_key")
129129
assert value == "secret-key-123"
130130

131131

132132
@pytest.mark.unit
133-
def test_resolve_config_from_http_header() -> None:
133+
def test_get_mcp_config_from_http_header() -> None:
134134
"""Test resolving config from HTTP header (takes precedence over env var)."""
135135
config_args = [
136136
MCPServerConfigArg(
@@ -146,12 +146,12 @@ def test_resolve_config_from_http_header() -> None:
146146
"fastmcp_extensions.server.get_http_headers",
147147
return_value={"X-API-Key": "header-key"},
148148
):
149-
value = resolve_config(app, "api_key")
149+
value = get_mcp_config(app, "api_key")
150150
assert value == "header-key"
151151

152152

153153
@pytest.mark.unit
154-
def test_resolve_config_header_case_insensitive() -> None:
154+
def test_get_mcp_config_header_case_insensitive() -> None:
155155
"""Test that HTTP header resolution is case-insensitive."""
156156
config_args = [
157157
MCPServerConfigArg(
@@ -167,21 +167,21 @@ def test_resolve_config_header_case_insensitive() -> None:
167167
"fastmcp_extensions.server.get_http_headers",
168168
return_value={"x-api-key": "lowercase-header-key"},
169169
):
170-
value = resolve_config(app, "api_key")
170+
value = get_mcp_config(app, "api_key")
171171
assert value == "lowercase-header-key"
172172

173173

174174
@pytest.mark.unit
175-
def test_resolve_config_unknown_name_raises_key_error() -> None:
175+
def test_get_mcp_config_unknown_name_raises_key_error() -> None:
176176
"""Test that resolving unknown config name raises KeyError."""
177177
app = mcp_server("test-server")
178178

179179
with pytest.raises(KeyError, match="Unknown config argument"):
180-
resolve_config(app, "nonexistent")
180+
get_mcp_config(app, "nonexistent")
181181

182182

183183
@pytest.mark.unit
184-
def test_resolve_config_required_missing_raises_value_error() -> None:
184+
def test_get_mcp_config_required_missing_raises_value_error() -> None:
185185
"""Test that missing required config raises ValueError."""
186186
config_args = [
187187
MCPServerConfigArg(
@@ -197,11 +197,11 @@ def test_resolve_config_required_missing_raises_value_error() -> None:
197197
"fastmcp_extensions.server.get_http_headers", return_value=None
198198
)
199199
with mock_headers, pytest.raises(ValueError, match="Required config"):
200-
resolve_config(app, "api_key")
200+
get_mcp_config(app, "api_key")
201201

202202

203203
@pytest.mark.unit
204-
def test_resolve_config_optional_missing_returns_empty_string() -> None:
204+
def test_get_mcp_config_optional_missing_returns_empty_string() -> None:
205205
"""Test that missing optional config returns empty string."""
206206
config_args = [
207207
MCPServerConfigArg(
@@ -214,7 +214,7 @@ def test_resolve_config_optional_missing_returns_empty_string() -> None:
214214
app = mcp_server("test-server", server_config_args=config_args)
215215

216216
with patch("fastmcp_extensions.server.get_http_headers", return_value=None):
217-
value = resolve_config(app, "optional_key")
217+
value = get_mcp_config(app, "optional_key")
218218
assert value == ""
219219

220220

@@ -237,7 +237,7 @@ def test_mcp_server_config_default_values() -> None:
237237

238238

239239
@pytest.mark.unit
240-
def test_resolve_config_with_string_default() -> None:
240+
def test_get_mcp_config_with_string_default() -> None:
241241
"""Test resolving config with a string default value."""
242242
config_args = [
243243
MCPServerConfigArg(
@@ -250,12 +250,12 @@ def test_resolve_config_with_string_default() -> None:
250250
app = mcp_server("test-server", server_config_args=config_args)
251251

252252
with patch("fastmcp_extensions.server.get_http_headers", return_value=None):
253-
value = resolve_config(app, "api_key")
253+
value = get_mcp_config(app, "api_key")
254254
assert value == "default-value"
255255

256256

257257
@pytest.mark.unit
258-
def test_resolve_config_with_callable_default() -> None:
258+
def test_get_mcp_config_with_callable_default() -> None:
259259
"""Test resolving config with a callable default value."""
260260
config_args = [
261261
MCPServerConfigArg(
@@ -268,12 +268,12 @@ def test_resolve_config_with_callable_default() -> None:
268268
app = mcp_server("test-server", server_config_args=config_args)
269269

270270
with patch("fastmcp_extensions.server.get_http_headers", return_value=None):
271-
value = resolve_config(app, "api_key")
271+
value = get_mcp_config(app, "api_key")
272272
assert value == "callable-default"
273273

274274

275275
@pytest.mark.unit
276-
def test_resolve_config_env_var_takes_precedence_over_default() -> None:
276+
def test_get_mcp_config_env_var_takes_precedence_over_default() -> None:
277277
"""Test that env var takes precedence over default value."""
278278
config_args = [
279279
MCPServerConfigArg(
@@ -286,12 +286,12 @@ def test_resolve_config_env_var_takes_precedence_over_default() -> None:
286286
app = mcp_server("test-server", server_config_args=config_args)
287287

288288
with patch.dict(os.environ, {"TEST_API_KEY": "env-value"}):
289-
value = resolve_config(app, "api_key")
289+
value = get_mcp_config(app, "api_key")
290290
assert value == "env-value"
291291

292292

293293
@pytest.mark.unit
294-
def test_resolve_config_with_only_env_var() -> None:
294+
def test_get_mcp_config_with_only_env_var() -> None:
295295
"""Test resolving config with only env_var set (no http_header_key)."""
296296
config_args = [
297297
MCPServerConfigArg(
@@ -303,12 +303,12 @@ def test_resolve_config_with_only_env_var() -> None:
303303
app = mcp_server("test-server", server_config_args=config_args)
304304

305305
with patch.dict(os.environ, {"TEST_API_KEY": "env-only-value"}):
306-
value = resolve_config(app, "api_key")
306+
value = get_mcp_config(app, "api_key")
307307
assert value == "env-only-value"
308308

309309

310310
@pytest.mark.unit
311-
def test_resolve_config_with_only_http_header() -> None:
311+
def test_get_mcp_config_with_only_http_header() -> None:
312312
"""Test resolving config with only http_header_key set (no env_var)."""
313313
config_args = [
314314
MCPServerConfigArg(
@@ -323,5 +323,5 @@ def test_resolve_config_with_only_http_header() -> None:
323323
"fastmcp_extensions.server.get_http_headers",
324324
return_value={"X-API-Key": "header-only-value"},
325325
):
326-
value = resolve_config(app, "api_key")
326+
value = get_mcp_config(app, "api_key")
327327
assert value == "header-only-value"

0 commit comments

Comments
 (0)