66import azure .functions as func
77from azure .functions import DataType , MCPToolContext
88from azure .functions .decorators .core import BindingDirection
9- from azure .functions .decorators .mcp import _MCPToolTrigger
10- from azure .functions .mcp import _MCPToolTriggerConverter
9+ from azure .functions .decorators .mcp import _MCPToolTrigger , MCPResourceTrigger
10+ from azure .functions .mcp import _MCPToolTriggerConverter , MCPResourceTriggerConverter
1111from azure .functions .meta import Datum
1212
1313
@@ -18,6 +18,7 @@ def test_mcp_tool_trigger_valid_creation(self):
1818 tool_name = "hello" ,
1919 description = "Hello world." ,
2020 tool_properties = "[]" ,
21+ metadata = '{"key": "value"}' ,
2122 data_type = DataType .UNDEFINED ,
2223 dummy_field = "dummy" ,
2324 )
@@ -32,6 +33,7 @@ def test_mcp_tool_trigger_valid_creation(self):
3233 "type" : "mcpToolTrigger" ,
3334 "dataType" : DataType .UNDEFINED ,
3435 "dummyField" : "dummy" ,
36+ "metadata" : '{"key": "value"}' ,
3537 "direction" : BindingDirection .IN ,
3638 },
3739 )
@@ -138,6 +140,28 @@ def add_numbers(a, b):
138140 '"isArray": false, '
139141 '"isRequired": true}]' )
140142
143+ def test_simple_signature_defaults_metadata (self ):
144+ @self .app .mcp_tool (metadata = '{"key": "value"}' )
145+ def add_numbers (a , b ):
146+ return a + b
147+
148+ trigger = add_numbers ._function ._bindings [0 ]
149+ self .assertEqual (trigger .description , "" )
150+ self .assertEqual (trigger .name , "context" )
151+ self .assertEqual (trigger .tool_name , "add_numbers" )
152+ self .assertEqual (trigger .metadata , '{"key": "value"}' )
153+ self .assertEqual (trigger .tool_properties ,
154+ '[{"propertyName": "a", '
155+ '"propertyType": "string", '
156+ '"description": "", '
157+ '"isArray": false, '
158+ '"isRequired": true}, '
159+ '{"propertyName": "b", '
160+ '"propertyType": "string", '
161+ '"description": "", '
162+ '"isArray": false, '
163+ '"isRequired": true}]' )
164+
141165 def test_with_binding_argument (self ):
142166 @self .app .mcp_tool ()
143167 @self .app .blob_input (arg_name = "file" , path = "" , connection = "Test" )
@@ -415,3 +439,68 @@ def add_numbers(a) -> int:
415439 '"description": "", '
416440 '"isArray": false, '
417441 '"isRequired": true}]' )
442+
443+
444+ class TestMCPResourceTrigger (unittest .TestCase ):
445+ def test_mcp_resource_trigger_valid_creation (self ):
446+ trigger = MCPResourceTrigger (
447+ name = "context" ,
448+ uri = "file://readme.md" ,
449+ resource_name = "myresource" ,
450+ title = "my title" ,
451+ description = "my resource description" ,
452+ mime_type = "Text/Markdown" ,
453+ size = 1024 ,
454+ metadata = "" ,
455+ data_type = DataType .UNDEFINED ,
456+ dummy_field = "dummy" ,
457+ )
458+ self .assertEqual (trigger .get_binding_name (), "mcpResourceTrigger" )
459+ self .assertEqual (
460+ trigger .get_dict_repr (),
461+ {
462+ "name" : "context" ,
463+ "uri" : "file://readme.md" ,
464+ "resourceName" : "myresource" ,
465+ "title" : "my title" ,
466+ "description" : "my resource description" ,
467+ "mimeType" : "Text/Markdown" ,
468+ "size" : 1024 ,
469+ "metadata" : "" ,
470+ "type" : "mcpResourceTrigger" ,
471+ "dataType" : DataType .UNDEFINED ,
472+ "dummyField" : "dummy" ,
473+ "direction" : BindingDirection .IN ,
474+ },
475+ )
476+
477+ def test_mcp_resource_trigger_only_required_args_creation (self ):
478+ trigger = MCPResourceTrigger (
479+ name = "context" ,
480+ uri = "file://readme.md" ,
481+ resource_name = "myresource"
482+ )
483+ self .assertEqual (trigger .get_binding_name (), "mcpResourceTrigger" )
484+ self .assertEqual (
485+ trigger .get_dict_repr (),
486+ {
487+ "name" : "context" ,
488+ "uri" : "file://readme.md" ,
489+ "resourceName" : "myresource" ,
490+ "type" : "mcpResourceTrigger" ,
491+ "direction" : BindingDirection .IN ,
492+ },
493+ )
494+
495+ def test_trigger_converter (self ):
496+ # Test with string data
497+ datum = Datum (value = '{"arguments":{}}' , type = 'string' )
498+ result = MCPResourceTriggerConverter .decode (datum , trigger_metadata = {})
499+ self .assertEqual (result , '{"arguments":{}}' )
500+ self .assertIsInstance (result , str )
501+
502+ # Test with json data
503+ datum_json = Datum (value = {"arguments" : {}}, type = 'json' )
504+ result_json = MCPResourceTriggerConverter .decode (datum_json , trigger_metadata = {})
505+ self .assertEqual (result_json , {"arguments" : {}})
506+ self .assertIsInstance (result_json , dict )
0 commit comments