diff --git a/README.md b/README.md
index 4fb74a3..bb2fa19 100644
--- a/README.md
+++ b/README.md
@@ -197,7 +197,7 @@ curl -X GET \
   -H 'X-Auth-Token: custom_token' \
   localhost:9020/nodes
 ```
-The response will return a list like this : [ { 'id' : node_1_id, 'description' : node1_description}, .. ] or an empty list if the server is not connected to external nodes.
+The response will return a list like this : [ { 'id' : node_1_id, 'description' : node1_description }, .. ] or an empty list if the server is not connected to external nodes.
 
 &nbsp;&nbsp;
 
@@ -228,6 +228,14 @@ curl -X POST \
   -H 'X-Auth-Token: custom_token' \
   localhost:9020/match/external/patient_id
 ```
+It is possible to search for matching patients on a specific node. To do so specify the node id in the request args. Example:
+```bash
+curl -X POST \
+  -H 'X-Auth-Token: custom_token' \
+  localhost:9020/match/external/patient_id?node=specific_node_id
+```
+Read [here](#node_list) how to get a list with the ID of the connected nodes.
+
 &nbsp;&nbsp;
 
 <a name="patient_matches"></a>
diff --git a/patientMatcher/match/handler.py b/patientMatcher/match/handler.py
index 7176e9b..3883429 100644
--- a/patientMatcher/match/handler.py
+++ b/patientMatcher/match/handler.py
@@ -119,17 +119,20 @@ def internal_matcher(database, patient_obj, max_pheno_score, max_geno_score, max
     return internal_match
 
 
-def external_matcher(database, patient):
+def external_matcher(database, patient, node=None):
     """Handles a query patient matching against all connected MME nodes
 
     Args:
         database(pymongo.database.Database)
         patient(dict) : a MME patient entity
+        node(str): id of the node to search in
 
     Returns:
         external_match(dict): a matching object containing a list of results in 'results' field
     """
-
+    query = {}
+    if node:
+        query['_id'] = node
     connected_nodes = list(database['nodes'].find()) #get all connected nodes
     if len(connected_nodes) == 0:
         LOG.error("Could't find any connected MME nodes. Aborting external matching.")
@@ -146,16 +149,18 @@ def external_matcher(database, patient):
         'data' : data, # description of the patient submitted
         'results' : [],
         'errors' : [],
-        'match_type' : 'external'
+        'match_type' : 'external',
+        'searched_nodes' : []
     }
 
-    LOG.info("Matching patient against {} nodes..".format(len(connected_nodes)))
+    LOG.info("Matching patient against {} node(s)..".format(len(connected_nodes)))
     for node in connected_nodes:
 
         server_name = node['_id']
         node_url = node['matching_url']
         token = node['auth_token']
         request_content_type = node['accepted_content']
+        external_match['searched_nodes'].append( { 'id': node['_id'], 'label' : node['label'] } )
 
         headers = {'Content-Type': request_content_type, 'Accept': 'application/vnd.ga4gh.matchmaker.v1.0+json', "X-Auth-Token": token}
         LOG.info('sending HTTP request to server: "{}"'.format(server_name))
diff --git a/patientMatcher/server/controllers.py b/patientMatcher/server/controllers.py
index 93dc9fe..1fa8da8 100644
--- a/patientMatcher/server/controllers.py
+++ b/patientMatcher/server/controllers.py
@@ -36,15 +36,14 @@ def patient(database, patient_id):
     return query_patient
 
 
-def match_external(database, query_patient):
+def match_external(database, query_patient, node=None):
     """Trigger an external patient matching for a given patient object"""
     # trigger the matching and save the matching id to variable
-    matching_obj = external_matcher(database, query_patient)
+    matching_obj = external_matcher(database, query_patient, node)
     # save matching object to database
 
     if matching_obj:
         database['matches'].insert_one(matching_obj)
-
     return matching_obj
 
 
diff --git a/patientMatcher/server/views.py b/patientMatcher/server/views.py
index 4a28406..388c57d 100644
--- a/patientMatcher/server/views.py
+++ b/patientMatcher/server/views.py
@@ -143,7 +143,17 @@ def match_external(patient_id):
         resp.status_code = 200
         return resp
 
-    matching_obj = controllers.match_external(current_app.db, query_patient)
+    node = request.args.get('node')
+
+    # if search should be performed on a specific node, make sure node is in database
+    if node and not current_app.db['nodes'].find({'_id':node}).count():
+        LOG.info('ERROR, theres no node with id "{}" in database'.format(request.args['node']))
+        message = 'ERROR. Could not find any connected node with id {} in database'.format(request.args['node'])
+        resp = jsonify(message)
+        resp.status_code = 200
+        return resp
+
+    matching_obj = controllers.match_external(current_app.db, query_patient, node)
 
     if not matching_obj:
         message = "Could not find any other node connected to this MatchMaker server"

Introduce the possibility to choose the external node to send a request to
Maybe it's interesting for final users. I am aware of at least another MME service which allows users to do that (RD Connect)
diff --git a/tests/server/test_server_responses.py b/tests/server/test_server_responses.py
index 745b1d6..57f1210 100644
--- a/tests/server/test_server_responses.py
+++ b/tests/server/test_server_responses.py
@@ -297,8 +297,16 @@ def test_match_external(test_client, test_node, database, json_patients):
     data = json.loads(response.data)
     assert data == 'Could not find any other node connected to this MatchMaker server'
 
+    # Try to send a request for a match on a node that does not exist
+    response = app.test_client().post(''.join(['/match/external/', inserted_id, '?node=meh']), headers = auth_headers(ok_token))
+    assert response.status_code == 200
+    data = json.loads(response.data)
+    # And check that node not found is in response message
+    assert data == 'ERROR. Could not find any connected node with id meh in database'
+
     # insert a connected node
     add_node(mongo_db=app.db, obj=test_node, is_client=False) # required for external matches
+    # send a request to match patients against all nodes
     response = app.test_client().post(''.join(['/match/external/', inserted_id]), headers = auth_headers(ok_token))
 
     # Response should be valid
@@ -306,6 +314,14 @@ def test_match_external(test_client, test_node, database, json_patients):
     # And a new match should be created in matches collection
     assert database['matches'].find().count() == 1
 
+    # send a request to match patients against the specific existing node:
+    response = app.test_client().post(''.join(['/match/external/', inserted_id, '?node=', test_node['_id']]), headers = auth_headers(ok_token))
+    # Response should be valid
+    assert response.status_code == 200
+
+    # And a new match should be created in matches collection. So total matches are 2
+    assert database['matches'].find().count() == 2
+
 
 def unauth_headers():
     head = {

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov mongomock
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==25.3.0
blessed==1.20.0
blinker==1.9.0
certifi==2025.1.31
charset-normalizer==3.4.1
click==8.1.8
coverage==7.8.0
enlighten==1.14.1
exceptiongroup==1.2.2
Flask==3.1.0
Flask-Mail==0.10.0
Flask-Negotiate==0.1.0
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
itsdangerous==2.2.0
Jinja2==3.1.6
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
MarkupSafe==3.0.2
mongomock==4.3.0
packaging==24.2
-e git+https://github.com/Clinical-Genomics/patientMatcher.git@107cfd03fb26553b2a68505a930ebcfbbc2a524b#egg=patientMatcher
pluggy==1.5.0
prefixed==0.9.0
pymongo==3.6.1
pytest==8.3.5
pytest-cov==6.0.0
pytz==2025.2
referencing==0.36.2
requests==2.32.3
rpds-py==0.24.0
sentinels==1.0.0
six==1.17.0
tomli==2.2.1
typing_extensions==4.13.0
urllib3==2.3.0
wcwidth==0.2.13
Werkzeug==3.1.3
zipp==3.21.0

name: patientMatcher
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==25.3.0
      - blessed==1.20.0
      - blinker==1.9.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - click==8.1.8
      - coverage==7.8.0
      - enlighten==1.14.1
      - exceptiongroup==1.2.2
      - flask==3.1.0
      - flask-mail==0.10.0
      - flask-negotiate==0.1.0
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - itsdangerous==2.2.0
      - jinja2==3.1.6
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - markupsafe==3.0.2
      - mongomock==4.3.0
      - packaging==24.2
      - pluggy==1.5.0
      - prefixed==0.9.0
      - pymongo==3.6.1
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - pytz==2025.2
      - referencing==0.36.2
      - requests==2.32.3
      - rpds-py==0.24.0
      - sentinels==1.0.0
      - six==1.17.0
      - tomli==2.2.1
      - typing-extensions==4.13.0
      - urllib3==2.3.0
      - wcwidth==0.2.13
      - werkzeug==3.1.3
      - zipp==3.21.0
prefix: /opt/conda/envs/patientMatcher

tests/server/test_server_responses.py::test_match_external
tests/server/test_server_responses.py::test_add_patient tests/server/test_server_responses.py::test_patient_view tests/server/test_server_responses.py::test_nodes_view tests/server/test_server_responses.py::test_delete_patient tests/server/test_server_responses.py::test_patient_matches tests/server/test_server_responses.py::test_match
patientMatcher/server/controllers.py README.md patientMatcher/match/handler.py patientMatcher/server/views.py
patientMatcher/server/controllers.py README.md patientMatcher/match/handler.py patientMatcher/server/views.py