Skip to content

When running the example and calling the Creating Tool using a cursor, an ERROR is returned #36

@anfreshman

Description

@anfreshman

[my operating environment]

Django version:5.2.4
python version:3.10
dms: 0.5.6

[scene]

I cloned the source code of this project and ran the example with the latest version. However, when I used the cursor to call LocationAPIView_CreateTool in the example, the system reported an error and the return value was as follows:

Error executing tool LocationAPIView_CreateTool: {'name': [ErrorDetail(string='This field is required.', code='required')]}

The complete error message from the server is:

[08/01/25 08:31:08] INFO     StreamableHTTP       streamable_http_manager.py:112
                             session manager                                    
                             started                                            
                    INFO     Processing request of type            server.py:619
                             CallToolRequest                                    
                    ERROR    Error in DRF tool invocation       djangomcp.py:529
                             ╭─ Traceback (most recent call l─╮                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/django-mcp-server/mcp_serv │                 
                             │ er/djangomcp.py:527 in         │                 
                             │ __call__                       │                 
                             │                                │                 
                             │   524 │   │                    │                 
                             │   525 │   │   # Create the vie │                 
                             │   526 │   │   try:             │                 
                             │ ❱ 527 │   │   │   return self. │                 
                             │   528 │   │   except Exception │                 
                             │   529 │   │   │   logger.excep │                 
                             │   530 │   │   │   raise exp    │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/cov_data_mcp/.venv/lib/pyt │                 
                             │ hon3.10/site-packages/django/v │                 
                             │ iews/decorators/csrf.py:65 in  │                 
                             │ _view_wrapper                  │                 
                             │                                │                 
                             │   62 │   else:                 │                 
                             │   63 │   │                     │                 
                             │   64 │   │   def _view_wrapper │                 
                             │ ❱ 65 │   │   │   return view_f │                 
                             │   66 │                         │                 
                             │   67 │   _view_wrapper.csrf_ex │                 
                             │   68                           │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/cov_data_mcp/.venv/lib/pyt │                 
                             │ hon3.10/site-packages/django/v │                 
                             │ iews/generic/base.py:105 in    │                 
                             │ view                           │                 
                             │                                │                 
                             │   102 │   │   │   │   │   "%s  │                 
                             │   103 │   │   │   │   │   "set │                 
                             │   104 │   │   │   │   )        │                 
                             │ ❱ 105 │   │   │   return self. │                 
                             │   106 │   │                    │                 
                             │   107 │   │   view.view_class  │                 
                             │   108 │   │   view.view_initkw │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/cov_data_mcp/.venv/lib/pyt │                 
                             │ hon3.10/site-packages/rest_fra │                 
                             │ mework/views.py:515 in         │                 
                             │ dispatch                       │                 
                             │                                │                 
                             │   512 │   │   │   response = h │                 
                             │   513 │   │                    │                 
                             │   514 │   │   except Exception │                 
                             │ ❱ 515 │   │   │   response = s │                 
                             │   516 │   │                    │                 
                             │   517 │   │   self.response =  │                 
                             │   518 │   │   return self.resp │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/django-mcp-server/mcp_serv │                 
                             │ er/djangomcp.py:507 in         │                 
                             │ raise_exception                │                 
                             │                                │                 
                             │   504 │   │   self.view_class  │                 
                             │   505 │   │                    │                 
                             │   506 │   │   def raise_except │                 
                             │ ❱ 507 │   │   │   raise exp    │                 
                             │   508 │   │                    │                 
                             │   509 │   │   kwargs = dict(   │                 
                             │   510 │   │   │   filter_backe │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/cov_data_mcp/.venv/lib/pyt │                 
                             │ hon3.10/site-packages/rest_fra │                 
                             │ mework/views.py:512 in         │                 
                             │ dispatch                       │                 
                             │                                │                 
                             │   509 │   │   │   else:        │                 
                             │   510 │   │   │   │   handler  │                 
                             │   511 │   │   │                │                 
                             │ ❱ 512 │   │   │   response = h │                 
                             │   513 │   │                    │                 
                             │   514 │   │   except Exception │                 
                             │   515 │   │   │   response = s │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/cov_data_mcp/.venv/lib/pyt │                 
                             │ hon3.10/site-packages/rest_fra │                 
                             │ mework/generics.py:194 in post │                 
                             │                                │                 
                             │   191 │   Concrete view for cr │                 
                             │   192 │   """                  │                 
                             │   193 │   def post(self, reque │                 
                             │ ❱ 194 │   │   return self.crea │                 
                             │   195                          │                 
                             │   196                          │                 
                             │   197 class ListAPIView(mixins │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/cov_data_mcp/.venv/lib/pyt │                 
                             │ hon3.10/site-packages/rest_fra │                 
                             │ mework/mixins.py:18 in create  │                 
                             │                                │                 
                             │   15 │   """                   │                 
                             │   16 │   def create(self, requ │                 
                             │   17 │   │   serializer = self │                 
                             │ ❱ 18 │   │   serializer.is_val │                 
                             │   19 │   │   self.perform_crea │                 
                             │   20 │   │   headers = self.ge │                 
                             │   21 │   │   return Response(s │                 
                             │      headers=headers)          │                 
                             │                                │                 
                             │ /Users/mika/PycharmProje │                 
                             │ cts/cov_data_mcp/.venv/lib/pyt │                 
                             │ hon3.10/site-packages/rest_fra │                 
                             │ mework/serializers.py:233 in   │                 
                             │ is_valid                       │                 
                             │                                │                 
                             │    230 │   │   │   │   self._e │                 
                             │    231 │   │                   │                 
                             │    232 │   │   if self._errors │                 
                             │ ❱  233 │   │   │   raise Valid │                 
                             │    234 │   │                   │                 
                             │    235 │   │   return not bool │                 
                             │    236                         │                 
                             ╰────────────────────────────────╯                 
                             ValidationError: {'name':                          
                             [ErrorDetail(string='This field is                 
                             required.', code='required')]}                     
                    INFO     StreamableHTTP       streamable_http_manager.py:116
                             session manager                                    
                             shutting down                                      
[01/Aug/2025 08:31:09] "POST /mcpunsecured HTTP/1.1" 200 212

[Other information]

I debugged and found that the root cause seemed to be the following exception reported in the create of CreateModelMixin, which caused the data to be unable to be obtained normally:

AssertionError('When a serializer is passed a data keyword argument you must call .is_valid() before attempting to access the serialized .data representation.\nYou should either call .is_valid() first, or access .initial_data instead.')

I used claude to help analyze and found that it might be because BaseAPIViewCallerTool's _patched_initialize_request did not create a DRF Request,If we change to the following implementation, everything seems to work fine:

    @staticmethod
    def _patched_initialize_request(self, request, *args, **kwargs):
        parser_context = self.get_parser_context(request)

        return Request(
            request,
            parsers=self.get_parsers(),
            authenticators=self.get_authenticators(),
            negotiator=self.get_content_negotiator(),
            parser_context=parser_context
        )

I'm not sure if there are historical reasons for the original design that I'm not aware of. If not, should I file a pull request to fix it?

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions